反射(二)
一.动态创建对象
构造函数无参数构造对象
class MyClass
{
privatestring _name;
publicstring Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
}
class Program
{
staticvoid Main(string[] args)
{
Assembly myass = Assembly.GetExecutingAssembly();//获取程序集
MyClass my = myass.CreateInstance("ConsoleApplication7.MyClass", true) as MyClass;//创建程序集中类型的实例方法一,CreateInstance,参数分别为类型名称和是否大小写无关。
my.Name = "rxm";
Console.WriteLine(my.Name);
ObjectHandle handle = Activator.CreateInstance(null, "ConsoleApplication7.MyClass");//创建程序集中类型的实例方法二,CreateInstance,参数分别为程序集名称(null表示当前),类型名称。
MyClass mynew = handle.Unwrap() as MyClass;
mynew.Name = "bj";
Console.WriteLine(mynew.Name);
Console.Read();
}
}
构造函数有参数构造对象
namespace ConsoleApplication7
{
class MyClass
{
privatestring _name;
privatestring _id;
public MyClass(string id, string name)
{
this._id = id;
this._name = name;
}
publicstring ID
{
get
{
return _id;
}
}
publicstring Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
}
class Program
{
staticvoid Main(string[] args)
{
Assembly myass = Assembly.GetExecutingAssembly();//获取程序集
object[] parameters = new object[2]; //构造函数的列表集合
parameters[0] = "001";
parameters[1] = "rxm";
MyClass obj = myass.CreateInstance("ConsoleApplication7.MyClass", true, BindingFlags.Default, null, parameters, null, null) as MyClass;
Console.WriteLine(obj.Name);
Console.WriteLine(obj.ID);
Console.Read();
}
}
}
二.动态调用方法
如果根据以上获得MyClass对象进行方法的调用,就和常规的方法调用一样了。
下面主要是通过.Net Reflection的方法实现。
namespace ConsoleApplication1
{
class MyClass
{
public int Add(int a, int b)
{
return a + b;
}
public static int square(int num)
{
return num * num;
}
}
class Program
{
static void Main(string[] args)
{
Assembly ass = Assembly.GetExecutingAssembly();
object obj = ass.CreateInstance("ConsoleApplication1.MyClass", true);
Type t = typeof(MyClass);
object[] parameters = new object[2];
parameters[0] = 3;
parameters[1] = 4;
int result = (int)t.InvokeMember("Add", BindingFlags.InvokeMethod, null, obj, parameters);//参数解析:方法名,说明调用的是个方法(也可以是字段/属性等),一个对象(该对象定义一组属性并启用绑定),非静态方法要说明是哪个对象调用,参数组。
//实例方法调用
MethodInfo addMethord = t.GetMethod("Add", BindingFlags.Instance | BindingFlags.Public);//获得一个方法。参数解析:方法名,方法描述(public的和可实例化的)。
int result_invoke = (int)addMethord.Invoke(obj, parameters);//根据得到的方法Invoke结果(对象实例,参数列表[没有为null])
//静态方法调用
MethodInfo squMethod = t.GetMethod("square", BindingFlags.Static | BindingFlags.Public);//静态的,public的
object[] staticParameters = new object[] { 9 };
Console.WriteLine((int)squMethod.Invoke(t, staticParameters));//81//由于是静态方法,参数一应该是属于的类型,或直接为null(不属于任何实例)
Console.WriteLine((int)squMethod.Invoke(null, staticParameters));//81
Console.WriteLine(result_invoke.ToString());
Console.WriteLine(result.ToString());
Console.Read();
}
}
}