using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; namespace Bowin.Common.Utility { /// /// MemberInfo 的扩展 /// public static class MemberInfoExtension { /// /// 检测 MemberInfo 对象是否具有指定的自定义特性。 /// /// 自定义特性 /// MemberInfo 对象的实例。 /// public static bool HasAttribute(this MemberInfo memberInfo) where TAttribute : Attribute { //if (memberInfo == null) return false; return HasAttribute(memberInfo, typeof(TAttribute)); } /// /// 检测 MemberInfo 对象是否具有指定的自定义特性。 /// /// MemberInfo 对象的实例。 /// 自定义特性的类型集合。 /// public static bool HasAttribute(this MemberInfo memberInfo, params Type[] attributeTypes) { return memberInfo.GetAttribute(attributeTypes).Any(); } /// /// 检测 MemberInfo 对象是否具有指定的自定义特性集合中的任意一项。 /// /// MemberInfo 对象的实例。 /// 自定义特性的类型集合。 /// public static bool HasAnyAttribute(this MemberInfo memberInfo, params Type[] attributeTypes) { return memberInfo.GetAttribute(attributeTypes).Any(); } /// /// 检测 MemberInfo 对象是否具有指定的自定义特性集合的所有项。 /// /// MemberInfo 对象的实例。 /// 自定义特性的类型集合。 /// public static bool HasAllAttribute(this MemberInfo memberInfo, params Type[] attributeTypes) { return attributeTypes.All(attributeType => memberInfo.HasAttribute(attributeType)); } /// /// 获取 MemberInfo 对象应用的自定义特性。 /// /// 自定义特性。 /// MemberInfo 对象的实例。 /// public static TAttribute GetAttribute(this MemberInfo memberInfo) where TAttribute : Attribute { if (memberInfo == null) { return null; } return (TAttribute)GetAttribute(memberInfo, typeof(TAttribute)).FirstOrDefault(); } /// /// 获取 MemberInfo 对象应用的自定义特性 /// /// MemberInfo 对象的实例。 /// 自定义特性的类型集合。 /// public static IEnumerable GetAttribute(this MemberInfo memberInfo, params Type[] attributeTypes) { if (memberInfo == null) { return Enumerable.Empty(); } var attributes = new HashSet(); foreach (object item in attributeTypes.SelectMany(attributeType => memberInfo.GetCustomAttributes(attributeType, true))) { attributes.Add(item); } return attributes.Select(s => (Attribute)s); } } }