C#知识--获取特性 Attribute
特性提供功能强大的方法,用以将元数据或声明信息与代码(程序集、类型、方法、属性等)相关联。特性与程序实体关联后,可在运行时使用“反射”查询特性,获取特性集合方法是GetCustomAttributes();
根据约定,所有特性名称都以单词“Attribute”结束,以便将它们与“.NET Framework”中的其他项区分。但是,在代码中使用特性时,不需要指定 attribute 后缀。在声明特性类时要以“Attribute”结束,使用时省略“Attribute”单词。
下面是几种使用特性的方法,菜鸟只是多看了一下总结一下,大神可以绕过:
类、程序集上的特性采用方法:
1 /// <summary> 2 /// 获取特性值方法 3 /// </summary> 4 /// <param name="t"></param> 5 /// <returns></returns> 6 public static string OutputDescription(Type t) 7 { 8 var attributes = t.GetCustomAttributes(); 9 foreach (Attribute attribute in attributes) 10 { 11 var attr = attribute as DescriptionAttribute; 12 if (attr != null) 13 { 14 return attr.Description; 15 } 16 } 17 return t.ToString(); 18 }
方法、属性采用扩展方法:
1 /// <summary> 2 /// 第一种获取特性值,适用只有单个特性 3 /// </summary> 4 public static class FingerGuessingGameTypeExtension 5 { 6 public static string GetEnumDescription(this FingerGuessingGameType enumType) 7 { 8 Type type = enumType.GetType(); 9 MemberInfo[] memberInfo = type.GetMember(enumType.ToString()); 10 if (memberInfo != null && memberInfo.Length > 0) 11 { 12 object[] attrs = memberInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false); 13 if (attrs != null && attrs.Length > 0) 14 { 15 return ((DescriptionAttribute)attrs[0]).Description; 16 } 17 } 18 19 return enumType.ToString(); 20 } 21 22 public static string GetEnumValue(this FingerGuessingGameType enumType) 23 { 24 Type type = enumType.GetType(); 25 MemberInfo[] memberInfo = type.GetMember(enumType.ToString()); 26 if (memberInfo != null && memberInfo.Length > 0) 27 { 28 object[] attrs = memberInfo[0].GetCustomAttributes(typeof(NameAttribute), false); 29 if (attrs != null && attrs.Length > 0) 30 { 31 return ((NameAttribute)attrs[0]).Name; 32 } 33 } 34 35 return enumType.ToString(); 36 } 37 } 38 /// <summary> 39 /// 第二种获取特性值,适用有多个特性 40 /// </summary> 41 public static class FingerExtension 42 { 43 private static Dictionary<Enum, ValueDescriptionPair> m_Dic=null; 44 45 public static string GetDescription(this FingerGuessingGameType enumType) 46 { 47 if (m_Dic == null) 48 { 49 Type type = enumType.GetType(); 50 var allValues = Enum.GetValues(type).OfType<Enum>(); 51 m_Dic = allValues.ToDictionary(p => p, p => GetDescriptionValue(type, p)); 52 } 53 54 ValueDescriptionPair valueDescription; 55 if (m_Dic.TryGetValue(enumType, out valueDescription)) 56 { 57 return valueDescription.Description; 58 } 59 return enumType.ToString(); 60 } 61 62 public static string GetValue(this FingerGuessingGameType enumType) 63 { 64 if (m_Dic == null) 65 { 66 Type type = enumType.GetType(); 67 var allValues = Enum.GetValues(type).OfType<Enum>(); 68 m_Dic = allValues.ToDictionary(p => p, p => GetDescriptionValue(type, p)); 69 } 70 71 ValueDescriptionPair valueDescription; 72 if (m_Dic.TryGetValue(enumType, out valueDescription)) 73 { 74 return valueDescription.Name; 75 } 76 return enumType.ToString(); 77 } 78 79 private static ValueDescriptionPair GetDescriptionValue(Type type, Enum value) 80 { 81 var valueDescriptionPair=new ValueDescriptionPair(); 82 var enumName=Enum.GetName(type,value); 83 var description=type.GetField(enumName) 84 .GetCustomAttributes(typeof (DescriptionAttribute), false) 85 .OfType<DescriptionAttribute>().FirstOrDefault(); 86 var enumValue = type.GetField(enumName) 87 .GetCustomAttributes(typeof(NameAttribute), false) 88 .OfType<NameAttribute>().FirstOrDefault(); 89 90 if (description != null) 91 { 92 valueDescriptionPair.Description = description.Description; 93 } 94 if (enumValue != null) 95 { 96 valueDescriptionPair.Name = enumValue.Name; 97 } 98 return valueDescriptionPair; 99 } 100 } 101 102 public class NameAttribute:Attribute 103 { 104 public NameAttribute(string name) 105 { 106 Name = name; 107 } 108 public string Name { get; set; } 109 } 110 111 public class ValueDescriptionPair 112 { 113 //Description 特性 114 public string Description { get; set; } 115 //Value 特性 116 public string Name { get; set; } 117 }
时间: 2024-10-10 20:37:04