• 利用反射代替switch


    根据传进来不同的值,调用不同的方法

    View Code
    protected void btn_SwitchClick(object sender, EventArgs e)
    {
        string result = "";
        switch (ddlMethod.SelectedValue)
        {
            case "A":
                result = SwitchTest.GetA();
                break;
            case "B":
                result = SwitchTest.GetB();
                break;
            case "C":
                result = SwitchTest.GetC();
                break;
            default:
                result = ddlMethod.SelectedValue + "方法找不到";
                break;
    
        }
        ltrResult.Text = result;
    }

    下面利用反射机制实现,首选需要一个自定义属性类

    View Code
    public class ActionMethodAttribute:Attribute
    {
        public string ActionTypeName;
    
        public ActionMethodAttribute(string typeName)
        {
            this.ActionTypeName = typeName;
        }
    }

    然后定义一个基类

    View Code
    public abstract class GenericBLL
    {
        public Hashtable GetMethodAttribute<T>(T t)
        {
            Hashtable ht = new Hashtable();
            Hashtable obj = CacheHandler<Hashtable>.GetCache(t.ToString());
            if (obj == null)
            {
                Type type = t.GetType();
                foreach (MethodInfo mi in type.GetMethods())
                {
                    ActionMethodAttribute[] mis = (ActionMethodAttribute[])mi.GetCustomAttributes(typeof(ActionMethodAttribute), false);
                    foreach (ActionMethodAttribute actionMethodAttribute in mis)
                    {
                        string actionName = actionMethodAttribute.ActionTypeName;
                        ht.Add(actionName, mi);
                    }
                }
                CacheHandler<Hashtable>.SetCache(t.ToString(), ht);
            }
            else
            {
                ht = (Hashtable)obj;
            }
            return ht;
        }
    
        /// <summary>
        /// return message;
        /// </summary>
        /// <param name="actionName"></param>
        /// <returns></returns>
        public string DoAction(string actionName)
        {
            string message;
            Hashtable ht = GetMethodAttribute(this);
            if (ht.Contains(actionName))
            {
                message = ((MethodInfo)ht[actionName]).Invoke(this, new object[] { }).ToString();
            }
            else
            {
                message = string.Format("{0} Not Defined.!", actionName);
                //throw new Exception(errmsg);
            }
            return message;
        }
    }

    实现类继承,

    View Code
    public class ReflectTest:GenericBLL
    {                   
        [ActionMethod("A")]
        public string GetA()
        {
            return "调用的A";
        }
    
        [ActionMethod("B")]
        public string GetB()
        {
            return "调用的B";
        }
    
    
        [ActionMethod("C")]
        public string GetC()
        {
            return "调用的C";
        }
    }

    具体的调用

    View Code
    protected void btn_ReflectClick(object sender, EventArgs e)
    {
        string result = ReflectTest.DoAction(ddlMethod.SelectedValue);
        ltrResult.Text = result;
    }

    ASPX中的代码如下

    View Code
    选D会提示没有D方法
    <asp:DropDownList ID="ddlMethod" runat="server">
        <asp:ListItem Text="A" Value="A">
        </asp:ListItem>
        <asp:ListItem Text="B" Value="B">
        </asp:ListItem>
        <asp:ListItem Text="C" Value="C">
        </asp:ListItem>
        <asp:ListItem Text="D" Value="D">
        </asp:ListItem>
    </asp:DropDownList>
    <br />
    <asp:Button ID="btnInvoke" Text="Switch" OnClick="btn_SwitchClick" runat="server" />
    <asp:Button ID="btnInvokeR" Text="Reflect" OnClick="btn_ReflectClick" runat="server" />
    <br>
    <asp:Literal ID="ltrResult" runat="server" />

    原代码下载: ActionMethod.rar

  • 相关阅读:
    html 上传图片前预览
    php获取当月天数及当月第一天及最后一天、上月第一天及最后一天实现方法
    php 计算 pdf文件页数
    php 获取半年内每个月的订单数量, 总价, 月份
    php 获取两个数组之间不同的值
    小程序支付功能
    关于nginx的Job for nginx.service failed because the control process exited with error code.错误
    linux 安装 Apollo
    MongoDB待续。。。
    ABP vNext...待续
  • 原文地址:https://www.cnblogs.com/vipsoft/p/2731126.html
Copyright © 2020-2023  润新知