博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
反射基本内容
阅读量:5162 次
发布时间:2019-06-13

本文共 2482 字,大约阅读时间需要 8 分钟。

一、程序集

①动态加载程序集 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();

七、lambda构造创建类

反射的性能比较低的,我们可以用lambda构造来代替或者构造函数调用得到一个对象。时间仓促,不做演示了:

 

直接copy真实项目的一段代码留下:

var cmd = type.GetCustomAttributes(typeof(LanduCmdAttribute), false).OfType
().Select(p => p.Cmd).Single(); var ctor = type.GetConstructors().Single(); //REF:https://stackoverflow.com/a/6582310/2430943 var func = (Func
)Expression.Lambda(typeof(Func
), Expression.New(ctor)).Compile(); dic[cmd] = func;

  

 

转载于:https://www.cnblogs.com/entclark/p/7900935.html

你可能感兴趣的文章
UVA 11374 Airport Express 机场快线 Dijistra+路径
查看>>
UIWebView 无缝切换到 WKWebView
查看>>
【python小练】0002
查看>>
【Django】不知道为什么就是想学一下 01
查看>>
C# Single Instance WinForms and Microsoft.VisualBasic.dll
查看>>
Query String模块和http小爬虫和events模块和fs模块和stream模块
查看>>
NOIP前的水题记录
查看>>
python:python之禅
查看>>
isKindOf和isMemberOf的区别
查看>>
深入浅出了解frame和bounds
查看>>
InstallShield 打包时需要注意
查看>>
我和面向对象有个约会
查看>>
转:Android Context的理解
查看>>
指定gpu
查看>>
TestNG Assert 详解
查看>>
【noip2004】 不高兴的津津 - 模拟
查看>>
Linux:tr命令详解
查看>>
C++ seekp 函数文件流跳转功能产生数据覆盖问题解决
查看>>
nRF51822 配置超过4个的 按键驱动
查看>>
C# Task,new Task().Start(),Task.Run();TTask.Factory.StartNew
查看>>