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

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​​