1. 程式人生 > >Net特性類Description了解下

Net特性類Description了解下

很大的 定義 add 參數初始化 equals pair static t對象 view

NET特性類都有個特點類名+Attribute,繼承基類Attribute,我們看下微軟自帶的特性類:DescriptionAttribute

技術分享圖片
namespace System.ComponentModel
{
    // 摘要:
    //     指定屬性或事件的說明。
    [AttributeUsage(AttributeTargets.All)]
    public class DescriptionAttribute : Attribute
    {
        // 摘要:
        //     指定 System.ComponentModel.DescriptionAttribute 的默認值,即空字符串 ("")。此 static 字段是只讀的。
public 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(); } }
View Code

看完這個類,我們了解到,此類是用來描述什麽的,作用對象可以是類、屬性、字段、接口、抽象、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了解下