反射 C#

反射指程序可以访问、检测和修改它本身状态或行为的一种能力;
可通过反射调用类型的方法或访问其字段和属性;

反射使用基类的type\object需要装箱拆箱操作,会消耗内存导致执行效率低;
且安全性低(可使用防反射机制避免反射);
可调试行低(无法通过断点调试);
所以反射尽量避免使用,除非有正常手段无法获取时再使用;

引入System.Reflection 命名空间

该命名空间包含通过检查托管代码中程序集、模块、成员、参数和其他实体的元数据来检索其相关信息的类型,还可用于操作加载类型的实例。

获取程序集
Assembly assem = typeof(Example).Assembly;
  • 程序集的作用

通过自定义程序集可以定义明晰的依赖关系,确保脚本更改后只会重新生成必须的程序集,减少编译时间;
可以跨项目进行程序的复用,加快开发效率;
支持跨语言编程(如可以在unity中使用C++语言编辑的DLL文件);

  • Unity创建程序集

在Assets文件夹下编写脚本,则默认编辑在Assembly-CSharp程序集中;
在Editor文件夹下编写脚本,则默认编译到Assembly-CSharp-Editor程序集中;
创建一个新的文件夹,通过Create-Assembly Definition创建一个新的程序集,则在此文件夹下写的脚本都会在此程序集中;除非子文件夹有自己的程序集定义,否则将包含子文件夹中的脚本。
若在Assets文件夹下创建自定义程序集,即为修改Assembly-CSharp程序集

获取类型
  • 已知类名,通过typeof关键字得到该类名对应的类型:
System.Type t = typeof(NameSpace.name);
  • 已知一个对象名,但不知该对象所属类,通过GetType()方获得该对象对应类的类型:
NameSpace.Name n = new NameSpace.Name(); 
System.Type t = n.GetType();
  • 已知类名但不能直接引用这个类,可通过GetType(“name”)方法传递带程序集和命名空间的类名的字符串获取到对应类的类型:
System.Type t = System.Type.GetType("name”);
Type类

是允许多个实现的抽象基类;
表示类型声明:类类型、接口类型、数组类型、值类型、枚举类型、类型参数、泛型类型定义,以及开放或封闭构造的泛型类型。(MSDN)

方法
MethodInfo类

表示类型的方法
可以使用 MethodInfo 对象获取有关对象所表示的方法的信息,以及调用方法。

  • 获取方法:Type.GetMethod(),有则返回MethodInfo,没有则返回null
  • 调用方法:info.Invoke(),调用由此 MethodInfo 实例反射的方法或构造函数
字段/属性
  • Type.GetField(),获取当前类型的特定字段,若有则返回FieldInfo
  • Type.GetProperty(),获取当前类型的特定属性,若有则返回PropertyInfo

通过GetValue方法获得字段或属性的值
通过SetValue方法设置字段或属性的值

获取私有信息
Activator 类

用以在本地或从远程创建对象类型,或获取对现有远程对象的引用。 此类不能被继承。
Activator.CreateInstance(),使用最符合指定参数的构造函数创建指定类型的实例。

  • 若要获取类的成员字段和成员方法,则需先实例化一个类的对象;
  • 若这个类的构造函数是私有的,则需通过System.Activator.CreateInstance()方法进行实例化;
  • 创建的类的实例用Object类型来接收;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值