反射一下方法介绍

反射第一步,要先拿到该类型的Type
Type typePerson=typeof(Person); 第一种方式
//获取所有的方法

通过对象拿到type
Person p=new Person();
Type typePerson=p.getType();第二种方式

获取所有的方法
MethodInfo[] methods=typePerson.GetMethods();
//遍历所有的方法

获取所有的属性
PropertyInfo[] properties=typePerson.GetProperties();
//变量所有的属性

//2.获取类中的某个方法,并调用该方法
2.0获取person的type
Type type=typeof(Person);
2.2获取sayhi方法
MethodInfo method=type.GetMethod("SayHi");

//调用当前方法

获取所有字段

FieldsInfo[] fields=typePerson.GetFields();
通过构造函数来创建对象
1获取person的type
Type typePerson=typeof(Person);
2.找到你要调用的构造函数
ConstructorInfo constructor=typePerson.GetConstructor(new Type[]{typeof(string),typeof(int),typeof(string)});
3.调用构造函数,创建对象
object objPerson=constructor.Invoke(new object[]{"扬中可","15","yzk@qq.com"})

要在不同项目拿到那个对象
要动态加载程序集

1动态加载程序集
Assembly asm=Assembly.LoadFile(string path);

2.获取该程序中的类型,无论是public还是internal
Type[] types=asm.GetTypes();
//只获取public类型
Type[] types=asm.GetExportedTypes();

获取某个类型
Type type=asm.GetType("xxx.Person");
是否可以把参数type
type.IsA


反射无处不在,我们天天在使用。Vs的智能提示,就是通过反射获取到类的属性、方法等。还有反编译工具也是通过反射实现
反射就是动态获取程序集的元数据(提供程序集的类型信息)的功能
反射:就是动态获取程序集中的元数据来操作类型的。
Type类实现反射的一个重要的类,通过它我们可以获取类中的所有信息包括方法、属性等。可以动态调用类的属性、方法。 Type是对类的描述。如何获取Person类中的所有属性?
反射就是直接通过.dll来创建对象,调用成员。
先通过一个普通类介绍Type.(Person)
通过类型元数据来获取对象的一些相关信息,并且还可以实例化对象调用方法等,这个就叫做“反射”。
反射让创建对象的方式发生了改变。
编译器的智能提示就是反射的一个应用


Type类的使用
通过类获得Type:Type t = typeof(Person)
通过对象获得类的Type:Type t = p.GetType()
“c:\abc.dll”
Assembly asm=Assembly.LoadFile(“c:\abc.dll”);
调用Assembly的GetExportedTypes方法可以得到Assembly中定义的所有的public类型。
调用Assembly的GetTypes()方法可以得到Assembly中定义的所有的类型。
调用Assembly的GetType(name)方法可以得到Assembly中定义的全名为name的类型信息。
插件:扩展主程序功能的dll.

Activator.CreateInstance(Type t)会动态调用类的无参构造函数创建一个对象,返回值就是创建的对象,如果类没有无参构造函数就会报错。
GetConstructor(参数列表);//这个是找到带参数的构造函数。
Type类的方法:在编写调用插件的程序时,需要做一系列验证。
bool IsAssignableFrom(Type c):(直译:是否可以从c赋值)判断当前的类型的变量是不是可以接受c类型变量的赋值。
typeof(IPlugin).IsAssignableFrom(t)                
bool IsInstanceOfType(object o):判断对象o是否是当前类的实例(当前类可以是o的类、父类、接口)
bool IsSubclassOf(Type c):判断当前类是否是类c的子类。类的事,没有接口的事。
IsAbstract,判断是否为抽象的,含接口

使用反射完成计算器简单工厂模式案例
public class Factory
    {
        public static Calculatorable FactoryOper(double n1, double n2, string oper)
        {
            Calculatorable cal = null;
           //得到你要加载程序集的路径
            string path = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Method");
            //判断路径是否存在
            if (!Directory.Exists(path))
            {
                return null;
            }
            //得到程序集
            string[] dllFiles=Directory.GetFiles(path, "*.dll");

            //循环遍历文件
            foreach (string file in dllFiles)
            { 
                //动态加载程序集
                Assembly asm=Assembly.LoadFile(file);
                //得到程序集中公共的类型
                Type[] types=asm.GetExportedTypes();
                Type typeIcal=typeof(Calculatorable);
                //循环遍历这些类型
                for (int i = 0; i < types.Length; i++)
                { 
                   //判断该类型是否继承了接口 并且能实例化
                    if (typeIcal.IsAssignableFrom(types[i]) && !types[i].IsAbstract)
                    { 
                        //动态创建对象
                        Calculatorable ical = (Calculatorable)Activator.CreateInstance(types[i], n1, n2);
                        //判断操作符是否相同
                        if (ical.Oper == oper)
                        {
                            cal = ical;
                        }
                    }
                }
            }
            return cal;
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值