您的位置:首页 > 其它

.net 反射,通过自定义Attribute动态调用类方法

2016-07-05 16:28 441 查看
自定义Attribute:

public class ActiveAttribute : Attribute

{

public string Msg { get; set; }

public ActiveAttribute(string msg)

{

Msg = msg;

}

}

自定义Attribute用于类:

namespace Test

{

[ActiveAttribute("ActiveDemo1")]

public class ActivityDemo : IActivity

{

public string View { set; get; }

public dynamic GetData()

{

List<string> List1 = new List<string>();

List1.Add("a");

List1.Add("b");

List<string> List2 = new List<string>();

List2.Add("c");

List2.Add("d");

Dictionary<string, object> dic = new Dictionary<string, object>();

dic.Add("key1", List1);

dic.Add("key2", List2);

return dic;

}

}

}

根据Attribute动态获取类:

//assemblyName是dll名,attrStr是Attibute的msg

public Type GetActivityClass(string assemblyName,string attrStr)

{

if (!String.IsNullOrEmpty(assemblyName))

{

assemblyName = path + assemblyName;

try

{

Assembly assembly = Assembly.LoadFrom(assemblyName);

Type[] ts = assembly.GetTypes();

foreach (Type t in ts)

{

var attrArr = t.GetCustomAttributes(typeof(ActiveAttribute), true);

ActiveAttribute attr = attrArr[0] as ActiveAttribute;

if (attr != null)

{

if (attr.Msg == attrStr)

{

return t;

}

}

}

}

catch (Exception e)

{

Log4NetHelp.Log.Error(e.Message);

throw new Exception(e.Message);

}

}

return null;

}

获取类并调取其方法:

string assemblyName = "Test";

Type t = assHelper.GetActivityClass(assemblyName, "ActiveDemo1");

MethodInfo mInfo = t.GetMethod("GetData");

object obj = Activator.CreateInstance(t);

dynamic result = mInfo.Invoke(obj, null);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  反射