作为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)。把一个方法转为泛型委托,便于快速反射调用