反射调用构造函数创建对象
我们可以用System.Reflection中的Assembly 类来获取相应的程序集在.net文档中有具体实现方法可以自行去查看
**load()**方法
例如:
在这里插入代码片
Assembly SampleAssembly = Assembly.Load
("SampleAssembly, Version=1.0.2004.0, Culture=neutral, PublicKeyToken=8744b20f8da049e3");
Assembly.LoadFrom 方法
例如:
Assembly SampleAssembly;
SampleAssembly = Assembly.LoadFrom("c:\\Sample.Assembly.dll");
也可以用Type.Assembly 属性获取,可能还有其他方法可以自行查看文档
获取到相应的程序集之后可以用Assembly.GetType 方法 获取到该程序集中指定类型的type对象 之后就可以调用构造函数创建对象了。
可以用Activator.CreateInstance 方法创建对象 该方法中有很多重载可以根据需求自行调用相应的重载。例如:
object objtext = Activator.CreateInstance(Type);
同样也可以用Type.GetConstructor 方法找到相应的构造方法,用ConstructorInfo.Invoke方法调用相应的构造函数创建对象
例如:
var cons = type.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance,null, new Type[] { typeof(int) } ,null);
cons.Invoke(new object []{1 });
反射调用方法
获取到程序集中对应类型的type对象之后用Type.GetMethod 方法 获取指定的方法,MethodBase.Invoke 方法调用指定方法
例如
var me1 = ty.GetMethod("a", new Type[] { typeof(int),typeof(int)});
me1.Invoke(objtext, new object[] { 1, 1 });
调用泛型方法同上述方法相似 不过有些版本没有对应 调用泛型方法重载 的方法调用时需要去对其进行一定的判断(或许有更好的办法我不知道有知道的可以指点我一下)
我的办法是获取到全部的方法遍历通过条件判断进行区分调用
如下:
//泛型方法的重载
var me = ty.GetMethods();
foreach (var m in me)
{
if (m.Name == "a")
{
if (m.IsGenericMethod)
{
if (m.GetGenericArguments().Length == 2)
{ //GetParameters()
var mnew = m.MakeGenericMethod(new Type[] { typeof(int), typeof(int) });
mnew.Invoke(objtext, new object[] { 1, 1 });
}
};
}
}
高版本的.net里面Type.GetMethod 方法 有相应的重载可以直接使用。可以去查一下文档