这是.Net中获取运行时类型信息的方式,.Net的应用程序由几个部分:‘程序集(Assembly)’、‘模块(Module)’、‘类型(class)’组成,而反射提供一种编程的方式,让程序员可以在程序运行期获得这几个组成部分的相关信息,例如:
Assembly类可以获得正在运行的装配件信息,也可以动态的加载装配件,以及在装配件中查找类型信息,并创建该类型的实例。
Type类可以获得对象的类型信息,此信息包含对象的所有要素:方法、构造器、属性等等,通过Type类可以得到这些要素的信息,并且调用之。
MethodInfo包含方法的信息,通过这个类可以得到方法的名称、参数、返回值等,并且可以调用之。
诸如此类,还有FieldInfo、EventInfo等等,这些类都包含在System.Reflection命名空间下。
1. Type t = processObj.GetType(); //processObj是传递的参数
if( t.GetInterface(“ITest”) !=null )
//用与判断传递参数是否实现某一接口
或者: 另外一种获取类型的方法是通过Type.GetType以及Assembly.GetType方法,如:
Type t = Type.GetType(“myNameSpace.classA”);
//myNameSpace为命名空间
object objA =Activator.CreateInstance(t);//这样就可以使用该类,
//该类必须有无参数的构造函数,否则不与执行
如果存在有参数的构造函数,那么必须指定
比如类 class classA
{
string myValues;
public classA(string values)
{ myValues=values;}
public string getValue(string prefix)
{
return prefix+":"+myValues;
}
}
要执行反射必须指明该构造函数的参数,它必须存在Objcet[]数组中
object[] obj=new object[]{“哈哈”};
Type t = Type.GetType(“myNameSpace.classA”);
ojbect ojbect=(class)Activator.CreateInstance(t,obj); //根据类型创建对象
3. 调用反射的方法使用类MethodInfo
//获取方法的信息
MethodInfo method = t.GetMethod("GetValue");
//调用方法的一些标志位,这里的含义是Public并且是实例方法,这也是默认的值
BindingFlags flag = BindingFlags.Public | BindingFlags.Instance;
//GetValue方法的参数
object[] parameters = new object[]{"Hello"};
//调用方法,用一个object接收返回值
Type t = Type.GetType(“myNameSpace.classA”);
object[] obj=new object[]{“哈哈”};
ojbect ojbect=(class)Activator.CreateInstance(t,obj);
MethodInfo method = t.GetMethod("GetValue");
BindingFlags flag = BindingFlags.Public | BindingFlags.Instance;
object[] parameters = new object[]{"Hello"};
object returnValue = method.Invoke(dObj,flag,Type.DefaultBinder,parameters,null);
4. 动态创建委托
委托是C#中实现事件的基础,有时候不可避免的要动态的创建委托,实际上委托也是一种类型:System.Delegate,所有的委托都是从这个类派生的
System.Delegate提供了一些静态方法来动态创建一个委托,比如一个委托:
namespace TestSpace {
delegate string TestDelegate(string value);
public class TestClass {
public TestClass() {
}
public void GetValue(string value) {
return value;
}
}
}
使用示例:
//获取类型,实际上这里也可以直接用typeof来获取类型
Type t = Type.GetType(“TestSpace.TestClass”);
//创建代理,传入类型、创建代理的对象以及方法名称
TestDelegate method = (TestDelegate)Delegate.CreateDelegate(t,obj,”GetValue”);
String returnValue = method(“hello”);
浙公网安备 33010602011771号