C#反射
2021-03-31 23:26
标签:动态创建 get 业务逻辑层 rop cto rect 存在 结果 今天 在前面简单学习了Linq To Object的常用标准查询运算符,在我们项目开发中,运用Linq表达式方便了我们编程,而接下来要讲的另一个内容——反射,也能很好地帮助我们处理某些特殊的情况。 反射提供了封装程序集、模块和类型的对象(Type类型)。可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了属性,可以利用反射对它们进行访问。 一般使用: 工厂类,通过反射创建类的实例,实现层与层之间的解耦: 数据层→数据会话层→业务逻辑层。 其中,数据会话层通过反射创建数据层的实例,业务逻辑层调用。 需求:通过反射获得Common程序集中的成员,并使用成员 1、把Common.dll放到该应用程序的bin/Debug目录下 2、可以遍历程序集中的类型,获取类型的命名空间和类型名称 3、创建type对象 a:创建没有构造函数的对象 b:反射出来的类型有构造函数 注意: 当反射出来的类型如果有构造函数,用上面代码中 ass.CreateInstance则会出现错误,如果有构造函数,那么该如何知道构造函数的参数? 4、获得数据类型中所有的属性 5、获得数据类型中所有的函数 6、目的:调用函数 当获得一个 .dll程序集的时候,需要先获取所有的类型,也就是这个程序集中的类,然后根据所需要类的名称,去创建指定名称的对象,如:Type type = ass.GetType("Common.FileCommon"); ,然后利用type获取构造函数、所有函数、属性(还有一些可以 type.方法名来获取相应的需求),再选择创建type对象的方法(构造或无构造),然后根据获得的函数来调用,传入相应的参数。 今天简单介绍一下反射的概念和基本用法,具体实际例子明天会写出。 C#反射 标签:动态创建 get 业务逻辑层 rop cto rect 存在 结果 今天 原文地址:https://www.cnblogs.com/jiechou/p/9249015.html一、反射的概念:
二、反射Type中的函数:
//判断两个成员是否存在继承关系 --后者继承于前者
bool b= typeof(Person).IsAssignableFrom(typeof(Student)); //student继承了person
//判断当前类是否为对象的实例
Student st = new Student();
Person p = new Person();
bool s = typeof(Person).IsInstanceOfType(st); //student继承了person 结果为true
bool b = p.GetType().IsInstanceOfType(st); //结果为true GetType当前对象的实例
//判断一个类是否为另外一个类的子类 --子类放先
bool c= typeof(Person).IsSubclassOf(typeof(Student));
//判断一个类是否为抽象类
typeof(Class).IsAbstract
三、反射中常用类的使用:
string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"Common.dll");
Assembly ass = Assembly.LoadFile(path); //需要绝对路径 LoadFile加载路径程序集内容 -->也不一定要在debug目录下,自己构建绝对路径也可
Type[] tp = ass.GetTypes(); //获得程序集中的所有类型 GetExportedTypes();获取公共类型
foreach (Type item in tp)
{
Console.WriteLine(item.Name); //类型名称 --也就是common下类或者接口的名称
Console.WriteLine(item.Namespace); //命名空间
}
object o = ass.CreateInstance("Common.FileCommon"); //FileCommom为Common命名空间的一个类 → 命名空间.类名
Type type = ass.GetType("Common.FileCommon"); //获得指定名称的Type对象
object o = Activator.CreateInstance(type, "参数");
ConstructorInfo [] info = type.GetConstructors(); //查询所有的构造函数,可以看到构造函数需要传递参数的参数类型
PropertyInfo [] pinfo = type.GetProperties(); //获取属性 然后可以遍历
MethodInfo [] minfo = type.GetMethods(); //获取所有的函数
MethodInfo method = type.GetMethod("WriteData"); //该类中的writeData方法
method.Invoke(o, "writeData方法的参数"); //o为上文创建的type对象
四、总结: