【整理】C#反射总结

1.使用反射获取类型
方法1:Type t=对象.GetType();
方法2:Type t=Type.GetType("System.String"),参数为在mscorlib.dll程序集中的类或者当前程序集中的类
如果要获得其他程序集中的类型,情况1:若要使用Type.GetType方法,则参数要指明该类型所在的程序集,如:获取System.Data.DataTable,代码如下

Type t = Type.GetType("System.Data.DataTable,System.Data,Version=1.0.3300.0,   Culture=neutral,   PublicKeyToken=b77a5c561934e089");

情况2:或者使用先加载所要调用的类型所在的程序集,再获取,如:A.dll要获取B.dll中的类型,代码如下

Assembly assembly = Assembly.LoadFrom(@"D:\MyPrograme\MyRelect\Bin\B.dll");
//获取类型信息
Type t = assembly.GetType("B.ReflectionTest");//为程序集名+类名

注意此时LoadFrom为全路径

额外提一下:

1)、Assembly.LoadFile只载入相应的dll文件,比如Assembly.LoadFile("abc.dll"),则载入abc.dll,假如abc.dll中引用了def.dll的话,def.dll并不会被载入。
Assembly.LoadFrom则不一样,它会载入dll文件及其引用的其他dll,比如上面的例子,def.dll也会被载入。

2)、用Assembly.LoadFrom载入一个Assembly时,会先检查前面是否已经载入过相同名字的Assembly,
比如abc.dll有两个版本(版本1在目录1下,版本2放在目录2下),程序一开始时载入了版本1,当使用Assembly.LoadFrom("2\\abc.dll")载入版本2时,不能载入,而是返回版本1。Assembly.LoadFile的话则不会做这样的检查,比如上面的例子换成Assembly.LoadFile的话,则能正确载入版本2。

2.判断类型是否实现了某个接口
t.GetInterface("接口名称")
3.根据类型动态创建对象
System.Activator提供了方法来根据类型动态创建对象
DataTable table=(DataTable)Activator.CreateInstance(t);
Type t=Type.GetType("TestSpace.TestClass");
Object[] constructParams=new object[]{"hello"};
TestClass obj=(TestClass)Activator.CreateInstance(t,constructParams);

4.如何获取方法以及动态调用方法

        Assembly assembly = Assembly.LoadFrom(@"D:\MyPrograme\MyRelect\Bin\ClassReflect.dll");
        
//获取类型信息
        Type t = assembly.GetType("ClassReflect.ReflectionTest");
        
//构造器的参数
        object[] constructParams = new object[] { "timmy" };
        
//根据类型创建对象
        object dObj = Activator.CreateInstance(t, constructParams);
        
//获取方法的信息
        MethodInfo method = t.GetMethod("GetValue");
        
//调用方法的一些标志位,这里的含义是Public并且是实例方法,这也是默认的值
        BindingFlags flag = BindingFlags.Public | BindingFlags.Instance;
        
//GetValue方法的参数
        object[] parameters = new object[] { "hello" };
        
//调用方法,用一个object接收返回值
        object returnValue = method.Invoke(dObj, flag, Type.DefaultBinder, parameters, null);

 

posted @ 2010-04-18 23:26  aisoon99  阅读(348)  评论(0编辑  收藏  举报