using System; using System.ComponentModel; using System.Reflection; namespace DS.Module.Core.Extensions; public static partial class Extensions { /// /// 判断类型是否为Nullable类型 /// /// 要处理的类型 /// 是返回True,不是返回False public static bool IsNullableType(this Type type) { return ((type != null) && type.IsGenericType) && (type.GetGenericTypeDefinition() == typeof(Nullable<>)); } /// /// 判断当前类型是否可由指定类型派生 /// /// /// /// /// public static bool IsDeriveClassFrom(this Type type, bool canAbstract = false) { return IsDeriveClassFrom(type, typeof(TBaseType), canAbstract); } /// /// 判断当前类型是否可由指定类型派生 /// public static bool IsDeriveClassFrom(this Type type, Type baseType, bool canAbstract = false) { type.NotNull(nameof(type)); baseType.NotNull(nameof(baseType)); return type.IsClass && (!canAbstract && !type.IsAbstract) && type.IsBaseOn(baseType); } /// /// 返回当前类型是否是指定基类的派生类 /// /// 当前类型 /// 要判断的基类型 /// public static bool IsBaseOn(this Type type, Type baseType) { if (baseType.IsGenericTypeDefinition) { return baseType.IsGenericAssignableFrom(type); } return baseType.IsAssignableFrom(type); } /// /// 判断当前泛型类型是否可由指定类型的实例填充 /// /// 泛型类型 /// 指定类型 /// public static bool IsGenericAssignableFrom(this Type genericType, Type type) { genericType.NotNull(nameof(genericType)); type.NotNull(nameof(type)); if (!genericType.IsGenericType) { throw new ArgumentException("该功能只支持泛型类型的调用,非泛型类型可使用 IsAssignableFrom 方法。"); } List allOthers = new List { type }; if (genericType.IsInterface) { allOthers.AddRange(type.GetInterfaces()); } foreach (var other in allOthers) { Type cur = other; while (cur != null) { if (cur.IsGenericType) { cur = cur.GetGenericTypeDefinition(); } if (cur.IsSubclassOf(genericType) || cur == genericType) { return true; } cur = cur.BaseType; } } return false; } /// /// 通过类型转换器获取Nullable类型的基础类型 /// /// 要处理的类型对象 /// public static Type GetUnNullableType(this Type type) { if (IsNullableType(type)) { NullableConverter nullableConverter = new NullableConverter(type); return nullableConverter.UnderlyingType; } return type; } ///// ///// 转换为Bool类型 ///// ///// ///// //public static bool ObjToBool(this object thisValue) //{ // bool reval = false; // if (thisValue != null && thisValue != DBNull.Value && bool.TryParse(thisValue.ToString(), out reval)) // { // return reval; // } // return reval; //} /// /// 判断是否IEnumerable、ICollection类型 /// /// /// // public static bool IsEnumerable(this Type type) // { // return type.IsArray // || type.GetInterfaces().Any(x => x == typeof(ICollection) || x == typeof(IEnumerable)); // } /// /// 从类型成员获取指定Attribute特性 /// /// Attribute特性类型 /// 类型类型成员 /// 是否从继承中查找 /// 存在返回第一个,不存在返回null public static T GetAttribute(this MemberInfo memberInfo, bool inherit = true) where T : Attribute { var attributes = memberInfo.GetCustomAttributes(typeof(T), inherit); return attributes.FirstOrDefault() as T; } /// /// 从类型成员获取指定Attribute特性 /// /// Attribute特性类型 /// 类型类型成员 /// 是否从继承中查找 /// 存在返回第一个,不存在返回null public static Type GetAttribute(this MemberInfo memberInfo, Type type, bool inherit = true) { var attributes = memberInfo.GetCustomAttributes(type, inherit); return attributes.FirstOrDefault() as Type; } /// /// 判断是否实体类型 /// /// /// // public static bool IsEntityType(this Type type) // { // type.NotNull(nameof(type)); // return typeof(IEntityWithIdentity<>).IsGenericAssignableFrom(type) && !type.IsAbstract && !type.IsInterface; // } /// /// 转换为Guid类型 /// /// /// public static Guid ToGuid(this string str) { Guid guid; if (Guid.TryParse(str, out guid)) { return guid; } else { return Guid.Empty; } } /// /// /// /// /// public static string ObjToString(this object thisValue) { if (thisValue != null) return thisValue.ToString().Trim(); return ""; } public static string ToDescription(this MemberInfo member) { DescriptionAttribute desc = member.GetCustomAttribute(); if (!desc.IsNull()) { return desc.Description; } //显示名 DisplayNameAttribute display = member.GetCustomAttribute(); if (!display.IsNull()) { return display.DisplayName; } return member.Name; } public static string GetKeySelector(this Type type, string keyName) { string[] propertyNames = keyName.Split("."); return propertyNames.Select(o => type.GetProperty(o)).FirstOrDefault()?.Name; } }