C#反射Helper
//反射 操作    public static class Reflection    {        #region GetDescription(获取类型描述)        ///         /// 获取类型描述,使用设置描述        ///         /// 类型        public static string GetDescription() => GetDescription(Common.GetType());        ///         /// 获取类型成员描述,使用设置描述        ///         /// 类型        /// 成员名称        public static string GetDescription(string memberName) => GetDescription(Common.GetType(), memberName);        ///         /// 获取类型成员描述,使用设置描述        ///         /// 类型        /// 成员名称        public static string GetDescription(Type type, string memberName)        {            if (type == null)                return string.Empty;            return memberName.IsEmpty()                ? string.Empty                : GetDescription(type.GetTypeInfo().GetMember(memberName).FirstOrDefault());        }        ///         /// 获取类型成员描述,使用设置描述        ///         /// 成员        public static string GetDescription(MemberInfo member)        {            if (member == null)                return string.Empty;            return member.GetCustomAttribute() is DescriptionAttribute attribute                ? attribute.Description                : member.Name;        }        #endregion        #region GetDisplayName(获取类型显示名称)        ///         /// 获取类型显示名称,使用设置显示名称        ///         /// 类型        ///         public static string GetDisplayName() => GetDisplayName(Common.GetType());        ///         /// 获取类型成员显示名称,,使用或设置显示名称        ///         /// 成员        ///         private static string GetDisplayName(MemberInfo member)        {            if (member == null)                return string.Empty;            if (member.GetCustomAttribute() is DisplayAttribute displayAttribute)                return displayAttribute.Description;            if (member.GetCustomAttribute() is DisplayNameAttribute displayNameAttribute)                return displayNameAttribute.DisplayName;            return string.Empty;        }        #endregion        #region GetDisplayNameOrDescription(获取显示名称或类型描述)        ///         /// 获取类型显示名称或描述,使用设置描述,使用设置显示名称        ///         /// 类型        ///         public static string GetDisplayNameOrDescription()        {            return GetDisplayNameOrDescription(Common.GetType());        }        ///         /// 获取类型显示名称或成员描述,使用设置描述,使用或设置显示名称        ///         /// 成员        ///         public static string GetDisplayNameOrDescription(MemberInfo member)        {            var result = GetDisplayName(member);            return string.IsNullOrWhiteSpace(result) ? GetDescription(member) : result;        }        #endregion        #region FindTypes(查找类型列表)        ///         /// 查找类型列表        ///         /// 查找类型        /// 待查找的程序集列表        ///         public static List FindType(params Assembly[] assemblies)        {            var findType = typeof(TFind);            return FindTypes(findType, assemblies);        }        ///         /// 查找类型列表        ///         /// 查找类型        /// 待查找的程序集列表        ///         public static List FindTypes(Type findType, params Assembly[] assemblies)        {            var result = new List();            foreach (var assembly in assemblies)            {                result.AddRange(GetTypes(findType, assembly));            }            return result.Distinct().ToList();        }        ///         /// 获取类型列表        ///         /// 查找类型        /// 待查找的程序集        ///         private static List GetTypes(Type findType, Assembly assembly)        {            var result = new List();            if (assembly == null) return result;            Type[] types;            try            {                types = assembly.GetTypes();            }            catch (ReflectionTypeLoadException)            {                return result;            }            foreach (var type in types)                AddType(result, findType, type);            return result;        }        ///         /// 添加类型        ///         /// 类型列表        /// 查找类型        /// 类型        private static void AddType(List result, Type findType, Type type)        {            if (type.IsInterface || type.IsAbstract)                return;            if (findType.IsAssignableFrom(type) == false && MatchGeneric(findType, type) == false)                return;            result.Add(type);        }        ///         /// 泛型匹配        ///         /// 查找类型        /// 类型        ///         private static bool MatchGeneric(Type findType, Type type)        {            if (findType.IsGenericTypeDefinition == false)                return false;            var definition = findType.GetGenericTypeDefinition();            foreach (var implementedInterface in type.FindInterfaces((filiter, criteria) => true, null))            {                if (implementedInterface.IsGenericType == false)                    continue;                return definition.IsAssignableFrom(implementedInterface.GetGenericTypeDefinition());            }            return false;        }        #endregion        #region GetInstancesByInterface(获取实现了接口的所有实例)        ///         /// 获取实现了接口的所有实例        ///         /// 接口类型        /// 在该程序集中查找        public static List GetInstancesByInterface(Assembly assembly)        {            var typeInterface = typeof(TInterface);            return assembly.GetTypes()                .Where(                t => typeInterface.GetTypeInfo().IsAssignableFrom(t) && t != typeInterface &&                t.GetTypeInfo().IsAbstract == false)                .Select(t => CreateInstance(t))                .ToList();        }        #endregion        #region CreateInstance(动态创建实例)        ///         /// 动态创建实例        ///         /// 目标类型        /// 类型        /// 传递给构造函数的参数        public static T CreateInstance(Type type, params object[] parameters) => Conv.To(Activator.CreateInstance(type, parameters));        ///         /// 动态创建实例        ///         /// 目标类型        /// 类名,包括命名空间,如果类型不处于当前执行程序集中,需要包含程序集名,范例:Test.Core.Test2,Test.Core        /// 传递给构造函数的参数        public static T CreateInstance(string className, params object[] parameters)        {            var type = Type.GetType(className) ?? Assembly.GetCallingAssembly().GetType(className);            return CreateInstance(type, parameters);        }        #endregion        #region GetAssembly(获取程序集)        ///         /// 获取程序集        ///         /// 程序集名称        ///         public static Assembly GetAssembly(string assemblyName) => Assembly.Load(new AssemblyName(assemblyName));        #endregion        #region GetAssemblies(从目录获取所有程序集)        ///         /// 从目录获取所有程序集        ///         /// 目录绝对路径        ///         public static List GetAssemblies(string directoryPath)        {            return                Directory.GetFiles(directoryPath, "*.*", SearchOption.AllDirectories)                .ToList()                 .Where(t => t.EndsWith(".exe") || t.EndsWith(".dll"))                 .Select(path => Assembly.Load(new AssemblyName(path)))                 .ToList();        }        #endregion        #region GetCurrentAssemblyName(获取当前程序集名称)        ///         /// 获取当前程序集名称        ///         public static string GetCurrentAssemblyName() => Assembly.GetCallingAssembly().GetName().Name;        #endregion        #region GetAttribute(获取特性信息)        ///         /// 获取特性信息        ///         /// 泛型特性        /// 元数据        public static TAttribute GetAttribute(MemberInfo memberInfo) where TAttribute : Attribute        {            return (TAttribute)memberInfo.GetCustomAttributes(typeof(TAttribute), false).FirstOrDefault();        }        #endregion        #region GetAttributes(获取特性信息数据)        ///         /// 获取特性信息数组        ///         /// 泛型特性        /// 元数据        ///         public static TAttribute[] GetAttributes(MemberInfo memberInfo) where TAttribute : Attribute        {            return Array.ConvertAll(memberInfo.GetCustomAttributes(typeof(TAttribute), false), x => (TAttribute)x);        }        #endregion        #region GetPropertyInfo(获取属性信息)        ///         /// 获取属性信息        ///         /// 类型        /// 属性名        /// 存在时返回PropertyInfo,不存在时返回null        public static PropertyInfo GetPropertyInfo(Type type, string propertyName) => type.GetProperties().FirstOrDefault(p => p.Name.Equals(propertyName));        #endregion        #region IsBool(是否布尔类型)        ///         /// 是否布尔类型        ///         /// 成员        ///         public static bool IsBool(MemberInfo member)        {            if (member == null)                return false;            switch (member.MemberType)            {                case MemberTypes.TypeInfo:                    return member.ToString() == "System.Boolean";                case MemberTypes.Property:                    return IsBool((PropertyInfo)member);            }            return false;        }        ///         /// 是否布尔类型        ///         /// 属性        ///         public static bool IsBool(PropertyInfo property)        {            return property.PropertyType == typeof(bool) || property.PropertyType == typeof(bool?);        }        #endregion        #region IsEnum(是否枚举类型)        ///         /// 是否枚举类型        ///         /// 成员        ///         public static bool IsEnum(MemberInfo member)        {            if (member == null)            {                return false;            }            switch (member.MemberType)            {                case MemberTypes.TypeInfo:                    return ((TypeInfo)member).IsEnum;                case MemberTypes.Property:                    return IsEnum((PropertyInfo)member);            }            return false;        }        ///         /// 是否枚举类型        ///         /// 属性        ///         public static bool IsEnum(PropertyInfo property)        {            if (property.PropertyType.GetTypeInfo().IsEnum)            {                return true;            }            var value = Nullable.GetUnderlyingType(property.PropertyType);            if (value == null)            {                return false;            }            return value.GetTypeInfo().IsEnum;        }        #endregion        #region IsDate(是否日期类型)        ///         /// 是否日期类型        ///         /// 成员        ///         public static bool IsDate(MemberInfo member)        {            if (member == null)            {                return false;            }            switch (member.MemberType)            {                case MemberTypes.TypeInfo:                    return member.ToString() == "System.DateTime";                case MemberTypes.Property:                    return IsDate((PropertyInfo)member);            }            return false;        }        ///         /// 是否日期类型        ///         /// 属性        ///         public static bool IsDate(PropertyInfo property)        {            if (property.PropertyType == typeof(DateTime))            {                return true;            }            if (property.PropertyType == typeof(DateTime?))            {                return true;            }            return false;        }        #endregion        #region IsInt(是否整型)        ///         /// 是否整型        ///         /// 成员        ///         public static bool IsInt(MemberInfo member)        {            if (member == null)            {                return false;            }            switch (member.MemberType)            {                case MemberTypes.TypeInfo:                    return member.ToString() == "System.Int32" || member.ToString() == "System.Int16" ||                           member.ToString() == "System.Int64";                case MemberTypes.Property:                    return IsInt((PropertyInfo)member);            }            return false;        }        ///         /// 是否整型        ///         /// 成员        ///         public static bool IsInt(PropertyInfo property)        {            if (property.PropertyType == typeof(int))            {                return true;            }            if (property.PropertyType == typeof(int?))            {                return true;            }            if (property.PropertyType == typeof(short))            {                return true;            }            if (property.PropertyType == typeof(short?))            {                return true;            }            if (property.PropertyType == typeof(long))            {                return true;            }            if (property.PropertyType == typeof(long?))            {                return true;            }            return false;        }        #endregion        #region IsNumber(是否数值类型)        ///         /// 是否数值类型        ///         /// 成员        ///         public static bool IsNumber(MemberInfo member)        {            if (member == null)            {                return false;            }            if (IsInt(member))            {                return true;            }            switch (member.MemberType)            {                case MemberTypes.TypeInfo:                    return member.ToString() == "System.Double" || member.ToString() == "System.Decimal" ||                           member.ToString() == "System.Single";                case MemberTypes.Property:                    return IsNumber((PropertyInfo)member);            }            return false;        }        ///         /// 是否数值类型        ///         /// 属性        ///         public static bool IsNumber(PropertyInfo property)        {            if (property.PropertyType == typeof(double))            {                return true;            }            if (property.PropertyType == typeof(double?))            {                return true;            }            if (property.PropertyType == typeof(decimal))            {                return true;            }            if (property.PropertyType == typeof(decimal?))            {                return true;            }            if (property.PropertyType == typeof(float))            {                return true;            }            if (property.PropertyType == typeof(float?))            {                return true;            }            return false;        }        #endregion        #region IsCollection(是否集合)        ///         /// 是否集合        ///         /// 类型        public static bool IsCollection(Type type) => type.IsArray || IsGenericCollection(type);        #endregion        #region IsGenericCollection(是否泛型集合)        ///         /// 是否泛型集合        ///         /// 类型        public static bool IsGenericCollection(Type type)        {            if (!type.IsGenericType)                return false;            var typeDefinition = type.GetGenericTypeDefinition();            return typeDefinition == typeof(IEnumerable<>)                   || typeDefinition == typeof(IReadOnlyCollection<>)                   || typeDefinition == typeof(IReadOnlyList<>)                   || typeDefinition == typeof(ICollection<>)                   || typeDefinition == typeof(IList<>)                   || typeDefinition == typeof(List<>);        }        #endregion        #region GetPublicProperties(获取公共属性列表)        ///         /// 获取公共属性列表        ///         /// 实例        public static List-  GetPublicProperties(object instance)        {            var properties = instance.GetType().GetProperties();            return properties.ToList().Select(t => new Item(t.Name, t.GetValue(instance))).ToList();        }        #endregion        #region GetTopBaseType(获取顶级基类)        ///         /// 获取顶级基类        ///         /// 类型        ///         public static Type GetTopBaseType()        {            return GetTopBaseType(typeof(T));        }        ///         /// 获取顶级基类        ///         /// 类型        ///         public static Type GetTopBaseType(Type type)        {            if (type == null)            {                return null;            }            if (type.IsInterface)            {                return type;            }            if (type.BaseType == typeof(object))            {                return type;            }            return GetTopBaseType(type.BaseType);        }        #endregion        #region IsGenericAssignableFrom(判断当前泛型类型是否可由指定类型的实例填充)        ///         /// 判断当前泛型类型是否可由指定类型的实例填充        ///         /// 泛型类型        /// 指定类型        public static bool IsGenericAssignableFrom(Type genericType, Type type)        {            Check.NotNull(genericType, nameof(genericType));            Check.NotNull(type, nameof(type));            if (!genericType.IsGenericType)            {                throw new ArgumentException("该功能只支持泛型类型的调用,非泛型类型可使用 IsAssignableFrom 方法。");            }            var allOthers = new List() { type };            if (genericType.IsInterface)            {                allOthers.AddRange(type.GetInterfaces());            }            foreach (var other in allOthers)            {                var cur = other;                while (cur != null)                {                    if (cur.IsGenericType)                    {                        cur = cur.GetGenericTypeDefinition();                    }                    if (cur.IsSubclassOf(genericType) || cur == genericType)                    {                        return true;                    }                    cur = cur.BaseType;                }            }            return false;        }        #endregion        #region GetElementType(获取元素类型)        ///         /// 获取元素类型。如果是集合,返回集合的元素类型        ///         /// 类型        public static Type GetElementType(Type type)        {            if (IsCollection(type) == false)                return type;            if (type.IsArray)                return type.GetElementType();            var genericArgumentsTypes = type.GetTypeInfo().GetGenericArguments();            if (genericArgumentsTypes == null || genericArgumentsTypes.Length == 0)                throw new ArgumentException("泛型类型参数不能为空");            return genericArgumentsTypes[0];        }        #endregion    }
 
#region IsEmpty(是否为空)        ///         /// 判断 字符串 是否为空、null或空白字符串        ///         /// 数据        public static bool IsEmpty(this string value) => string.IsNullOrWhiteSpace(value);        #endregion        #region SafeString(安全转换为字符串)        ///         /// 安全转换为字符串,去除两端空格,当值为null时返回""        ///         /// 输入值        public static string SafeString(this object input) => input == null ? string.Empty : input.ToString().Trim();        #endregion
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。