//(1)利用反射可以在运行时得到类型信息
// 包括方法、属性、事件、字段及构造函数,还可以获得每个成员的名称、限定符和参数等信息。
//(2)利用反射可以在运行时根据得到的类型信息动态创建类型的实例,设置字段,调用方法,设置属性和激发事件。
//------------------System.Reflection命名空间中的一些类------------------------------------------
//
// System.Object
// System.Reflection.Assembly
// System.Reflection.Module
// System.Reflection.ParameterInfo
// System.Reflection.MemberInfo
// System.Reflection.EventInfo
// System.Reflection.FieldInfo
// System.Reflection.MethodBase
// System.Reflection.ConstructorInfo
// System.Reflection.MethodInfo
// System.Reflection.PropertyInfo
// System.Type
//
// MemberInfo 类是用于获取类的所有成员(构造函数、事件、字段、方法和属性)信息的类的抽象基类。
//----------------------------------------------------------------------------------------------
//Assembly类的CreateInstance()方法在创建具有无参数构造函数的对象时比较方便,创建具有有参数构造函数的对象时比较麻烦。
//Assembly类的CreateInstance()方法的内部是调用系统激活器类Activator的CreateInstance来创建对象的。
using System.Reflection;
{
public class MyClass
{
public string MyField;
{
Console.WriteLine("调用 MyMethod! MyField: {0}", MyField);
}
{
Console.WriteLine("调用 MyMethod! MyField: {0}. 参数: {1}", MyField, param);
}
}
}
------------------------------------------------------------------------------------------------------------------
using System;
using System.Reflection;
namespace _08_22
{
public class Class_08_22
{
public static void Main()
{
Type t = typeof(object);
// 从文件中加载程序集 MyAssembly
Assembly a = Assembly.LoadFrom("MyAssembly.dll");
// 获取程序集中名为"MyClass"的 Type, 这里必须用全名
Type type = a.GetType("_08_22.MyClass");
// 动态创建 MyClass 的一个实例
Object obj = Activator.CreateInstance(type);
// 动态设置 obj 的字段
FieldInfo field = type.GetField("MyField");
field.SetValue(obj, "动态设置的字段");
// 动态调用 obj 的方法
MethodInfo method = type.GetMethod("MyMethod", new Type[0]);
method.Invoke(obj, null);
method = type.GetMethod("MyMethod", new Type[] { typeof(string) });
method.Invoke(obj, new Object[] { "一个参数" });
}
}
}