using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.IO; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Resources; using System.Text; namespace Masuit.Tools.Reflection { /// /// 反射操作辅助类,如获取或设置字段、属性的值等反射信息。 /// public static class ReflectionUtil { #region 属性字段设置 #pragma warning disable 1591 public static BindingFlags bf = BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static; #pragma warning restore 1591 /// /// 执行方法 /// /// 反射对象 /// 方法名,区分大小写 /// 方法参数 /// 约束返回的T必须是引用类型 /// T类型 public static T InvokeMethod(this object obj, string methodName, object[] args) where T : class { T objReturn; Type type = obj.GetType(); objReturn = type.InvokeMember(methodName, bf | BindingFlags.InvokeMethod, null, obj, args) as T; return objReturn; } /// /// 设置字段 /// /// 反射对象 /// 字段名 /// 值 public static void SetField(this object obj, string name, object value) { FieldInfo fi = obj.GetType().GetField(name, bf); fi.SetValue(obj, value); } /// /// 获取字段 /// /// 反射对象 /// 字段名 /// 约束返回的T必须是引用类型 /// T类型 public static T GetField(this object obj, string name) where T : class { FieldInfo fi = obj.GetType().GetField(name, bf); return fi.GetValue(obj) as T; } /// /// 获取所有的字段信息 /// /// 反射对象 /// 字段信息 public static FieldInfo[] GetFields(this object obj) { FieldInfo[] fieldInfos = obj.GetType().GetFields(bf); return fieldInfos; } /// /// 设置属性 /// /// 反射对象 /// 属性名 /// 值 public static void SetProperty(this object obj, string name, object value) { PropertyInfo fieldInfo = obj.GetType().GetProperty(name, bf); value = Convert.ChangeType(value, fieldInfo.PropertyType); fieldInfo.SetValue(obj, value, null); } /// /// 获取属性 /// /// 反射对象 /// 属性名 /// 约束返回的T必须是引用类型 /// T类型 public static T GetProperty(this object obj, string name) where T : class { PropertyInfo fieldInfo = obj.GetType().GetProperty(name, bf); return fieldInfo.GetValue(obj, null) as T; } /// /// 获取所有的属性信息 /// /// 反射对象 /// 属性信息 public static PropertyInfo[] GetProperties(this object obj) { PropertyInfo[] propertyInfos = obj.GetType().GetProperties(bf); return propertyInfos; } #endregion #region 获取Description /// /// Get The Member Description using Description Attribute. /// /// /// Get The Enum Field Description using Description Attribute. /// /// The value. /// return description or value.ToString() public static string GetDescription(this Enum value) { return GetDescription(value, null); } /// /// Get The Enum Field Description using Description Attribute and /// objects to format the Description. /// /// Enum For Which description is required. /// An Object array containing zero or more objects to format. /// return null if DescriptionAttribute is not found or return type description /// "/> is null. public static string GetDescription(this Enum value, params object[] args) { if (value == null) { throw new ArgumentNullException(nameof(value)); } FieldInfo fi = value.GetType().GetField(value.ToString()); DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false); var text = attributes.Length > 0 ? attributes[0].Description : value.ToString(); if ((args != null) && (args.Length > 0)) { return string.Format(null, text, args); } return text; } /// /// Get The Type Description using Description Attribute. /// /// Specified Member for which Info is Required /// return null if DescriptionAttribute is not found or return type description public static string GetDescription(this MemberInfo member) { return GetDescription(member, null); } /// /// Get The Type Description using Description Attribute and /// objects to format the Description. /// /// Specified Member for which Info is Required /// An Object array containing zero or more objects to format. /// return if DescriptionAttribute is /// not found or return type description /// "/> is null. public static string GetDescription(this MemberInfo member, params object[] args) { string text1; if (member == null) { throw new ArgumentNullException(nameof(member)); } if (member.IsDefined(typeof(DescriptionAttribute), false)) { DescriptionAttribute[] attributes = (DescriptionAttribute[])member.GetCustomAttributes(typeof(DescriptionAttribute), false); text1 = attributes[0].Description; } else { return string.Empty; } if (args != null && args.Length > 0) { return string.Format(null, text1, args); } return text1; } #endregion #region 获取Attribute信息 /// /// Gets the specified object attributes /// /// /// Gets the specified object attributes for assembly as specified by type /// /// The attribute Type for which the custom attributes are to be returned. /// the assembly in which the specified attribute is defined /// Attribute as Object or null if not found. /// "/> is null. public static object GetAttribute(this Type attributeType, Assembly assembly) { if (attributeType == null) { throw new ArgumentNullException(nameof(attributeType)); } if (assembly == null) { throw new ArgumentNullException(nameof(assembly)); } if (assembly.IsDefined(attributeType, false)) { object[] attributes = assembly.GetCustomAttributes(attributeType, false); return attributes[0]; } return null; } /// /// Gets the specified object attributes for type as specified by type /// /// The attribute Type for which the custom attributes are to be returned. /// the type on which the specified attribute is defined /// Attribute as Object or null if not found. public static object GetAttribute(this Type attributeType, MemberInfo type) { return GetAttribute(attributeType, type, false); } /// /// Gets the specified object attributes for type as specified by type with option to serach parent /// /// The attribute Type for which the custom attributes are to be returned. /// the type on which the specified attribute is defined /// if set to [search parent]. /// /// Attribute as Object or null if not found. /// public static object GetAttribute(this Type attributeType, MemberInfo type, bool searchParent) { if (type == null) { return null; } if (!(attributeType.IsSubclassOf(typeof(Attribute)))) { return null; } if (type.IsDefined(attributeType, searchParent)) { object[] attributes = type.GetCustomAttributes(attributeType, searchParent); if (attributes.Length > 0) { return attributes[0]; } } return null; } /// /// Gets the collection of all specified object attributes for type as specified by type /// /// The attribute Type for which the custom attributes are to be returned. /// the type on which the specified attribute is defined /// Attribute as Object or null if not found. public static object[] GetAttributes(this Type attributeType, MemberInfo type) { return GetAttributes(attributeType, type, false); } /// /// Gets the collection of all specified object attributes for type as specified by type with option to serach parent /// /// The attribute Type for which the custom attributes are to be returned. /// the type on which the specified attribute is defined /// The attribute Type for which the custom attribute is to be returned. /// /// Attribute as Object or null if not found. /// public static object[] GetAttributes(this Type attributeType, MemberInfo type, bool searchParent) { if (type == null) { return null; } if (!(attributeType.IsSubclassOf(typeof(Attribute)))) { return null; } if (type.IsDefined(attributeType, false)) { return type.GetCustomAttributes(attributeType, searchParent); } return null; } #endregion #region 资源获取 /// /// 根据资源名称获取图片资源流 /// /// /// 资源的名称 /// 数据流 public static Stream GetImageResource(this Assembly _, string resourceName) { Assembly asm = Assembly.GetExecutingAssembly(); return asm.GetManifestResourceStream(resourceName); } /// /// 获取程序集资源的位图资源 /// /// 程序集中的某一对象类型 /// 资源的根名称。例如,名为“MyResource.en-US.resources”的资源文件的根名称为“MyResource”。 /// 资源项名称 public static Bitmap LoadBitmap(this Type assemblyType, string resourceHolder, string imageName) { Assembly thisAssembly = Assembly.GetAssembly(assemblyType); ResourceManager rm = new ResourceManager(resourceHolder, thisAssembly); return (Bitmap)rm.GetObject(imageName); } /// /// 获取程序集资源的文本资源 /// /// 程序集中的某一对象类型 /// 资源项名称 /// 资源的根名称。例如,名为“MyResource.en-US.resources”的资源文件的根名称为“MyResource”。 public static string GetStringRes(this Type assemblyType, string resName, string resourceHolder) { Assembly thisAssembly = Assembly.GetAssembly(assemblyType); ResourceManager rm = new ResourceManager(resourceHolder, thisAssembly); return rm.GetString(resName); } /// /// 获取程序集嵌入资源的文本形式 /// /// 程序集中的某一对象类型 /// 字符集编码 /// 嵌入资源相对路径 /// 如没找到该资源则返回空字符 public static string GetManifestString(this Type assemblyType, string charset, string resName) { Assembly asm = Assembly.GetAssembly(assemblyType); Stream st = asm.GetManifestResourceStream(string.Concat(assemblyType.Namespace, ".", resName.Replace("/", "."))); if (st == null) { return ""; } int iLen = (int)st.Length; byte[] bytes = new byte[iLen]; st.Read(bytes, 0, iLen); return (bytes != null) ? Encoding.GetEncoding(charset).GetString(bytes) : ""; } #endregion #region 创建实例 /// /// 获取默认实例 /// /// 类型 /// public static object GetInstance(this Type type) { return GetInstance(type, null); } /// /// 获取默认实例 /// /// 类型 /// public static object GetInstance(string type) { return GetInstance(Type.GetType(type), null); } /// /// 获取一个构造参数的实例 /// /// 参数类型 /// 实例类型 /// 参数值 /// public static object GetInstance(this Type type, TArg argument) { return GetInstance(type, argument, null); } /// /// 获取一个构造参数的实例 /// /// 参数类型 /// 实例类型 /// 参数值 /// public static object GetInstance(string type, TArg argument) { return GetInstance(Type.GetType(type), argument, null); } /// /// 获取2个构造参数的实例 /// /// 参数类型 /// 参数类型 /// 实例类型 /// 参数值 /// 参数值 /// public static object GetInstance(this Type type, TArg1 argument1, TArg2 argument2) { return GetInstance(type, argument1, argument2, null); } /// /// 获取2个构造参数的实例 /// /// 参数类型 /// 参数类型 /// 实例类型 /// 参数值 /// 参数值 /// public static object GetInstance(string type, TArg1 argument1, TArg2 argument2) { return GetInstance(Type.GetType(type), argument1, argument2, null); } /// /// 获取3个构造参数的实例 /// /// 参数类型 /// 参数类型 /// 参数类型 /// 实例类型 /// 参数值 /// 参数值 /// 参数值 /// public static object GetInstance(this Type type, TArg1 argument1, TArg2 argument2, TArg3 argument3) { return InstanceCreationFactory.CreateInstanceOf(type, argument1, argument2, argument3); } /// /// 获取3个构造参数的实例 /// /// 参数类型 /// 参数类型 /// 参数类型 /// 实例类型 /// 参数值 /// 参数值 /// 参数值 /// public static object GetInstance(string type, TArg1 argument1, TArg2 argument2, TArg3 argument3) { return InstanceCreationFactory.CreateInstanceOf(Type.GetType(type), argument1, argument2, argument3); } private class TypeToIgnore { } private static class InstanceCreationFactory { private static readonly Dictionary> InstanceCreationMethods = new Dictionary>(); public static object CreateInstanceOf(Type type, TArg1 arg1, TArg2 arg2, TArg3 arg3) { CacheInstanceCreationMethodIfRequired(type); return InstanceCreationMethods[type].Invoke(arg1, arg2, arg3); } private static void CacheInstanceCreationMethodIfRequired(Type type) { if (InstanceCreationMethods.ContainsKey(type)) { return; } var argumentTypes = new[] { typeof(TArg1), typeof(TArg2), typeof(TArg3) }; Type[] constructorArgumentTypes = argumentTypes.Where(t => t != typeof(TypeToIgnore)).ToArray(); var constructor = type.GetConstructor(BindingFlags.Instance | BindingFlags.Public, null, CallingConventions.HasThis, constructorArgumentTypes, new ParameterModifier[0]); var lamdaParameterExpressions = new[] { Expression.Parameter(typeof(TArg1), "param1"), Expression.Parameter(typeof(TArg2), "param2"), Expression.Parameter(typeof(TArg3), "param3") }; var constructorParameterExpressions = lamdaParameterExpressions.Take(constructorArgumentTypes.Length).ToArray(); var constructorCallExpression = Expression.New(constructor, constructorParameterExpressions); var constructorCallingLambda = Expression.Lambda>(constructorCallExpression, lamdaParameterExpressions).Compile(); InstanceCreationMethods[type] = constructorCallingLambda; } } #endregion } }