初探反射
Posted 【我是谁】
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初探反射相关的知识,希望对你有一定的参考价值。
一、程序集
①动态加载程序集
Assembly ams = Assembly.LoadFile(@"xxx.dll");
②获取指定类型所在的程序集,一般获取之后是为了获取反射其它类型
typeof(TestAttribute).Assembly
③获取程序集所在的Type
//1.0获取所有类型
ams.GetTypes()
//2.0获取所有public类型
ams.GetExportedTypes()
//获取指定类型的Type,如以下获取Person的,参数是完全限定名称(命名空间(项目右击属性查看,一般和程序集名相同)+类名)
Type typePerson = ams.GetType("PersonNameSPace.Person");
二、动态调用方法
①获取 //会全部获取出来,包括继承object的,属性(本质就是方法) MethodInfo[] methods = typePerson.GetMethods(); for (int i = 0; i < methods.Length; i++) { Console.WriteLine(methods[i].Name); } ②获取指定的并且调用 var methodSayHi= typePerson.GetMethod("SayHi"); //第一个参数是类型对象,第二个是方法参数; //调用就跟委托一样Invoke methodSayHi.Invoke(Activator.CreateInstance(typePerson), null); Console.ReadKey();
三、方法参数,构造函数有多个或者重载怎么办?
//需要在获取方法的时候指定参数有哪些类型,类型顺序一定要一致 var methodSayHi= typePerson.GetMethod("SayHi",new Type[]{typeof(string)}); methodSayHi.Invoke(Activator.CreateInstance(typePerson), new object[] { "xxx" });
四、为属性赋值
var nameProp= typePerson.GetProperty("Name"); var obj=Activator.CreateInstance(typePerson); nameProp.SetValue(obj, "123");//设置值 Console.WriteLine(nameProp.GetValue(obj));//获取值
五、创建对象
实现1:调用无参构造函数:object obj= Activator.CreateInstance(typePerson); 实现2:调用有参构造函数 1、通过type类型获取指定的构造函数,参数是构造函数的参数的type类型数组(按顺序) 构造函数: public Person(int age,string name) { this.Age = age; this.Name = name; } 2、获取此构造函数并且调用 ConstructorInfo ctor= typePerson.GetConstructor(new Type[] {typeof(int),typeof(string)}); object obj= ctor.Invoke(new object[] { 19, "XXX" }); //获取之后就能调用方法等操作了,比如: 调用方法: MethodInfo info = typePerson.GetMethod("SayHi"); info.Invoke(obj,null);
六、获取非public的方法,就把sayhi方法改为私有的再测试
Person p = new Person();
Type typePerson = typeof(Person);
MethodInfo method = typePerson.GetMethod("SayHi", BindingFlags.NonPublic | BindingFlags.Instance);
method.Invoke(Activator.CreateInstance(typePerson), null);
Console.WriteLine("ok");
Console.ReadKey();
以上是关于初探反射的主要内容,如果未能解决你的问题,请参考以下文章