C# 反射
- 什么是反射
反射是.Net 提供的一个帮助类库,可以访问DLL,MetaData(元数据)。
通过反射可以提供类型信息,从而使得我们开发人员在运行时能够利用这些信息构造和使用对象。
反射机制允许程序在执行过程中动态地添加各种功能。
| MetaData | DLL | exe |
|---|---|---|
| DLL和EXE的描述文件 | 应用程序扩展、动态库 | 可执行程序 |
typeof运算符
as ,is 能够测试两种类型的兼容性。但大多数情况下,还需要获得某个类型的具体信息。这就用到了typeof,它可以返回与具体类型相关的System.Type对象,通过System.Type对象可以去顶此类型的特征。一旦获得给定类型的Type对象,就可以通过使用该对象定义的各种属性,字段,方法来获取类型的具体信息。Type类包含了很多成员,在接下来的反射中再详细讨论。下面简单的演示Type对象,调用它的三个属性
点击查看代码
static void Main(string[] args)
{
Type t=typeof(StringBuilder);
Console.WriteLine(t.FullName); //FullName属性返回类型的全称
if (t.IsClass)
{
Console.WriteLine("is a class"); //打印
}
if (t.IsSealed) //是否为密封类
{
Console.WriteLine("is Sealed"); //打印
}
Console.ReadKey();
}
常用的方法
- 加载dll到反射实例(命名空间+类名),使用时缺少加载的DLL的依赖项或者不存在的DLL会报错
点击查看代码
Assembly assemly = Assembly.Load("`nameSpace.class`");
- 获取模块信息、程序及类型数组集合、获取类型下的方法集合
点击查看代码
assemly.GetModules();
assemly.GetTypes();
assemly.GetTypes()[0].GetMethods();
- 加载类型并创建实例
点击查看代码
Type type = assemly.GetType("Class");
//调用无参构造函数创建一个运行对象
object instance = Activator.CreateInstance(type);
//调用有参构造函数(按顺序)创建一个运行对象
object instance1 = Activator.CreateInstance(type,new object[] { "parmeter"});
操作方法
点击查看代码
//加载类型
Type testType = assemly.GetType("Class");
//构造对象
object oTest = Activator.CreateInstance(testType);
//获取指定函数,函数参数类型,有重载的情况可以指定类型
MethodInfo method = testType.GetMethod("methods",new Type[] {"typeof(int)});
//调用函数
method.Invoke(oTest, null);
//获取方法参数
method.GetParameters()
//获取方法返回值
method.ReturnParameter
//调用泛型方法
Type genericType = assemly.GetType("GenericMethod");
object oGeneric = Activator.CreateInstance(genericType);
//获取方法
MethodInfo method = genericType.GetMethod("Show");
//指定方法参数类型
MethodInfo methodNew = method.MakeGenericMethod(typeof(int), typeof(string), typeof(int));
//调用函数
methodNew.Invoke(oGeneric, new object[] { 1, "admin", 0 });

浙公网安备 33010602011771号