c#用反射创建实例的几种方法

c# 用反射创建实例的几种方法

借鉴自

C#反射-动态创建对象:https://blog.csdn.net/heyangyi_19940703/article/details/51346357

http://blog.51cto.com/zero01/2067822

c#反射详解;https://www.cnblogs.com/wangshenhe/p/3256657.html

C#—反射ConstructorInfo:https://blog.csdn.net/Pig_3800/article/details/64130213

在java的工厂模式中可能有如下类似的用法,如:Factory addFactory = (Factory) Class.forName(“org.zero01.factory.AddFactory”).newInstance();

1,创建对象

var t1 = typeof(TestClass);//TestClass表示一个类
var clsinstance = System.Reflection.Assembly.Load(t1.Assembly.GetName()).CreateInstance(t1.FullName);

Assembly asm = Assembly.GetExecutingAssembly();//获取当前代码所在程序集
Object obj = asm.CreateInstance(“反射创建对象实例.TestClass”,true);
//反射创建对象实例表示命名空间,TestClass表示类

//使用Activator创建对象
System.Runtime.Remoting.ObjectHandle handler = System.Activator.CreateInstance(“反射创建对象实例”, “反射创建对象实例1.TestClass1”);
//CreateInstance 第一个参数为程序集名称,如果为null 表示当前程序集,第二个参数表示要创建的类型
Object obj1 = handler.Unwrap();

//使用有参构造函数创建对象
Object [] param= new Object[2];
param[0]=1;
param[1]=2;
Assembly asm2 = Assembly.GetExecutingAssembly();
Object obj2 = asm2.CreateInstance(“AssemblyDemo.TestClass”, true, BindingFlags.Default, null, param ,null,null);
//BindingFlag是限定对类型成员的搜索,这里Default不使用BindingFlags策略

//使用ConstructorInfo 创建类的实例
//直接用无参数构造函数创建实例
Type t = Type.GetType(typeName);
System.Reflection.ConstructorInfo ci = t.GetConstructor(new Type[] { });
object instance = ci.Invoke(null);
t.GetMethod(methodName).Invoke(instance, null);
//object result = t.InvokeMember(methodName, BindingFlags.InvokeMethod, null, instance, null);

//获取所有符合要求的无参数构造函数,再根据传入的参数判断用哪个构造函数去实例化
//按照所选择的参数,返回这个类里面所有符合要求构造函数
//如果是私有的话,参数可以选择BindingFlags.NonPublic | BindingFlags.Instance
ConstructorInfo[] ctor = typeof(TestClass).GetConstructors();
//用Lamber表达式,查找含有两个参数的构造函数
ConstructorInfo info = Array.Find(ctor, c => c.GetParameters().Length == 2);
if (info != null)
//调用构造函数,传入两个参数,返回一个该类的实例
TestClass test = info.Invoke(new object[] { 100, “Tom” }) as TestClass;

2,动态调用方法:使用InvokeMember调用方法

//动态调用无参数方法
Type t = typeof(TestClass);
TestClass ts=new TestClass (1,2);
int result = (int)t.InvokeMember(“show”, BindingFlags.InvokeMethod,null,ts,null);
Console.WriteLine(result);


//动态调用有参静态方法
Type t1 = typeof(TestClass);
int result1 = (int)t1.InvokeMember(“show”,BindingFlags.InvokeMethod,null,t1,param);
Console.WriteLine(result1);

3,.使用MethodInfo.Invoke调用方法:

//使用MethodInfo.Invoke调用方法
Type t2 = typeof(TestClass);
TestClass ts2 = new TestClass();
MethodInfo mi = t2.GetMethod(“show”,BindingFlags.Instance|BindingFlags.Public);
int result2=(int)mi.Invoke(ts2, null);
//如果没有任何参数,则 parameters,也就是第二个参数应为 null。
Console.WriteLine(result2);


Type t3 = typeof(TestClass);
MethodInfo mi1 = t3.GetMethod(“show”,BindingFlags.Static|BindingFlags.Public);
int result3 = (int)mi1.Invoke(null, param);
//如果方法是静态的,则忽略第一个参数。也就可以设置为Null
Console.WriteLine(result3);

猜你喜欢

转载自blog.csdn.net/qq_37326058/article/details/85225964
今日推荐