作为X组件的基础,内置了一个轻量级反射扩展库Reflect。

Reflect是静态扩展类,具体反射功能由IReflect支持。多年前的典型实现是EMIT,性能很好。后来出现了表达式替代反射。再后来,.NET4.5以后,nfx自身的反射性能大幅提升,于是把IReflect默认实现改为默认反射。


也正是由于IReflect的存在,X组件平稳的从.NET2.0过渡到.NET4.0、.NET4.5、.NET4.8,乃至于NETCore2.0、NETCore3.1等等。


Nuget包:NewLife.Core

源码:https://github.com/NewLifeX/X/blob/master/NewLife.Core/Reflection/Reflect.cs

视频:https://www.bilibili.com/video/BV1gq4y1g78w

视频:https://www.bilibili.com/video/BV1E44y1f7xH

反射获取

反射获取类型、方法、属性等,一般获取后缓存起来,避免频繁调用带来性能损耗。

  • Type GetTypeEx(this String typeName, Boolean isLoadAssembly = true)。根据名称获取类型。可搜索当前目录DLL,自动加载。(已废除!20220422)
  • Type GetTypeEx(this String typeName)。根据名称获取类型,Type.GetType() 增强版
  • MethodInfo GetMethodEx(this Type type, String name, params Type[] paramTypes)。获取方法
  • IList<PropertyInfo> GetProperties(this Type type, Boolean baseFirst)。获取用于序列化的属性,过滤带有XmlIgnore、ScriptIgnore、IgnoreDataMember等特性的属性,过滤索引器。
  • IList<FieldInfo> GetFields(this Type type, Boolean baseFirst)。获取用于序列化的字段


反射调用

反射调用一般指的是创建对象以及调用方法。

  • Object CreateInstance(this Type type, params Object[] parameters)。反射创建指定类型的实例
  • Object Invoke(this Object target, String name, params Object[] parameters)。反射调用指定对象的方法。target为类型时调用其静态方法
  • Object GetValue(this Object target, String name, Boolean throwOnError = true)。获取目标对象指定名称的属性/字段值
  • Boolean SetValue(this Object target, String name, Object value)。设置目标对象指定名称的属性/字段值,若不存在返回false
  • void Copy(this Object target, Object src, Boolean deep = false, params String[] excludes) 。从源对象拷贝数据到目标对象


类型辅助

.NET 具有完整的类库,强大的泛型,有些辅助方法很实用。

  • Type GetElementTypeEx(this Type type)。获取一个类型的元素类型
  • Object ChangeType(this Object value, Type conversionType)。类型转换
  • TResult ChangeType<TResult>(this Object value)。类型转换
  • Boolean IsInt(this Type type)。是否整数


插件

为了实现插件开发,经常需要判断父级类。

  • Boolean As(this Type type, Type baseType)。是否能够转为指定基类
  • Boolean As<T>(this Type type)。是否能够转为指定基类
  • TFunc As<TFunc>(this MethodInfo method, Object target = null)。把一个方法转为泛型委托,便于快速反射调用