码迷,mamicode.com
首页 > 其他好文 > 详细

利用反射代替switch -转

时间:2015-11-17 23:26:43      阅读:248      评论:0      收藏:0      [点我收藏+]

标签:

原文地址:http://www.cnblogs.com/vipsoft/archive/2012/10/19/2731126.html

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

技术分享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

利用反射代替switch -转

标签:

原文地址:http://www.cnblogs.com/professional-NET/p/4973054.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!