好贷网好贷款

反射一下方法介绍

发布时间:2016-12-5 6:23:46 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"反射一下方法介绍",主要涉及到反射一下方法介绍方面的内容,对于反射一下方法介绍感兴趣的同学可以参考一下。

反射第一步,要先拿到该类型的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","[email protected]"}) 要在不同项目拿到那个对象 要动态加载程序集 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;         }

上一篇:boost.date_time
下一篇:入门题目.net

相关文章

相关评论