Net特性類Description了解下
阿新 • • 發佈:2018-08-04
很大的 定義 add 參數初始化 equals pair static t對象 view
NET特性類都有個特點類名+Attribute,繼承基類Attribute,我們看下微軟自帶的特性類:DescriptionAttribute
namespace System.ComponentModel { // 摘要: // 指定屬性或事件的說明。 [AttributeUsage(AttributeTargets.All)] public class DescriptionAttribute : Attribute { // 摘要: // 指定 System.ComponentModel.DescriptionAttribute 的默認值,即空字符串 ("")。此 static 字段是只讀的。View Codepublic static readonly DescriptionAttribute Default; // 摘要: // 不帶參數初始化 System.ComponentModel.DescriptionAttribute 類的新實例。 public DescriptionAttribute(); // // 摘要: // 初始化 System.ComponentModel.DescriptionAttribute 類的新實例並帶有說明。 // //參數: // description: // 說明文本。 [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")] public DescriptionAttribute(string description); // 摘要: // 獲取存儲在此特性中的說明。 // // 返回結果:// 存儲在此特性中的說明。 public virtual string Description { get; } // // 摘要: // 獲取或設置作為說明存儲的字符串。 // // 返回結果: // 作為說明存儲的字符串。默認值為空字符串 ("")。 protected string DescriptionValue { get; set; } // 摘要: // 返回給定對象的值是否等於當前的 System.ComponentModel.DescriptionAttribute。 // // 參數: // obj: // 要進行值的相等性測試的對象。 // // 返回結果: // 如果給定對象的值等於當前對象的值,則為 true;否則為 false。 public override bool Equals(object obj); public override int GetHashCode(); // // 摘要: // 返回一個值,該值指示這是否為默認 System.ComponentModel.DescriptionAttribute 實例。 // // 返回結果: // 如果這是默認 System.ComponentModel.DescriptionAttribute 實例,則為 true;否則為 false。 public override bool IsDefaultAttribute(); } }
看完這個類,我們了解到,此類是用來描述什麽的,作用對象可以是類、屬性、字段、接口、抽象、xxx
我們來看個作用對象為類的,我們定義一個人的類型,有兩個屬性 姓名和性別
public class Person { [Description("姓名")] public string Name { get; set; } [Description("性別")] public int Sex { get; set; } }View Code
是不是覺得很熟悉,網上很多ORM工具生成的代碼是不是和上面很像,但大多數都是自定義特性類
其實特性類,在我們實際做項目中起到很大的作用,本人舉一個場景,在做報表的過程中,導出EXCEL過程中,列名和列的類型都是很有講究的,一般我們準備的數據大多數都是List集合
List對象就是一個類,我們可以用到特性類來描述每列的中文名稱,再讀取字段類型,基本都是可以滿足導出功能,下面看一個封裝代碼
public class ReflectionHelper<T> where T : new() { /// <summary> /// 獲取特性信息 /// </summary> /// <param name="t"></param> /// <returns></returns> public static List<PropertityFieldInfo> GetPropertiyInfo() { List<PropertityFieldInfo> listRtn = new List<PropertityFieldInfo>(); Dictionary<int, string> dicPropertiy = new Dictionary<int, string>(); Dictionary<int, Type> dicFiled = new Dictionary<int, Type>(); Dictionary<int, string> dicFiledName = new Dictionary<int, string>(); T obj = new T(); var pindex = 0; var properties = obj.GetType().GetProperties(); var files = obj.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public); foreach (var p in properties) { var v = (DescriptionAttribute[])p.GetCustomAttributes(typeof(DescriptionAttribute), false); var desc = v[0].Description; dicFiledName.Add(pindex, p.Name); dicPropertiy.Add(pindex, desc); pindex++; } var findex = 0; foreach (var f in files) { var fieldType = f.FieldType; dicFiled.Add(findex, fieldType); findex++; } foreach (KeyValuePair<int, string> kv in dicPropertiy) { PropertityFieldInfo m = new PropertityFieldInfo(); m.Name = dicFiledName[kv.Key]; m.Desc = dicPropertiy[kv.Key]; m.Type = dicFiled[kv.Key]; listRtn.Add(m); } return listRtn; } /// <summary> /// 獲取所有列名描述 /// </summary> /// <returns></returns> public static List<string> GetPropertiyDescInfo() { List<string> list = new List<string>(); var propertiyInfos = GetPropertiyInfo(); foreach (var item in propertiyInfos) { list.Add(item.Desc); } return list; } } public class PropertityFieldInfo { public string Name { get; set; } public string Desc { get; set; } public Type Type { get; set; } }View Code
控制臺運行下
class Program { static void Main(string[] args) { var dic = ReflectionHelper<Person>.GetPropertiyInfo(); foreach (var kv in dic) { Console.WriteLine(kv.Name); Console.WriteLine(kv.Type); Console.WriteLine(kv.Desc); } Console.Read(); } }View Code
看結果
ReflectionHelper,此類方法中有用到反射和泛型,關於反射和泛型大家可以自己去學習下,大家可以舉一反三自己寫個特性類,其實我們博客也有寫
希望此文章對小夥伴們有幫助,喜歡的點個贊,謝謝!
Net特性類Description了解下