Net特性類Description瞭解下

来源:https://www.cnblogs.com/Ryan2012/archive/2018/08/04/9419413.html
-Advertisement-
Play Games

NET特性類都有個特點類名+Attribute,繼承基類Attribute,我們看下微軟自帶的特性類:DescriptionAttribute namespace System.ComponentModel { // 摘要: // 指定屬性或事件的說明。 [AttributeUsage(Attrib ...


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();
    }
}

看完這個類,我們瞭解到,此類是用來描述什麼的,作用對象可以是類、屬性、欄位、介面、抽象、xxx

我們來看個作用對象為類的,我們定義一個人的類型,有兩個屬性 姓名和性別

public class Person
{
    [Description("姓名")]
    public string Name { get; set; }

    [Description("性別")]
    public int Sex { get; set; }
}

是不是覺得很熟悉,網上很多ORM工具生成的代碼是不是和上面很像,但大多數都是自定義特性類,其實特性類,在我們實際做項目中起到很大的作用,本人舉一個場景,在做報表的過程中,導出EXCEL過程中,列名和列的類型都是很有講究的,一般我們準備的數據大多數都是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; }
}

控制台運行下

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();
        }
    }

看結果

 

總結:ReflectionHelper 此類用到反射和泛型機制,有興趣小伙伴可以自學下,關於自定義特性類,本人博客中也寫過,好了,
希望此文對大家有幫助,喜歡的點個贊,3Q!

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 學習計劃 第十一天: 1、sso註冊功能實現 2、sso登錄功能實現 3、通過token獲得用戶信息 4、Ajax跨域請求(jsonp) 2. Sso系統工程搭建 需要創建一個sso服務工程,可以參考e3-manager創建。 e3-sso(pom聚合工程) |--e3-sso-interfa ...
  • 一、三元表達式 三元表達式僅應用於: 1、條件成立返回一個值 2、條件不成立返回一個值 res=x if x > y else y print(res) 二、函數遞歸 定義:函數的遞歸調用,即在函數調用的過程中,又直接或間接地調用了函數本身 1、直接調用 2、間接調用 遞歸分為兩個階段 1、回溯: ...
  • [TOC] 目前 EF 是 .NET 平臺下相當成熟的 ORM 框架,但是其最新發佈的 6.x 版本依然不支持 SQLite 的 CodeFirst 模式,好在有大神已經在 Nuget 上發佈的相應的 Package 來解決這個問題。筆者通過做一個小實驗來驗證一下。 問題描述 SQLite 本身不支 ...
  • unsigned char a[5] = { 12,36,96,128,182 }; a[]範圍為0~256. 數組中數都有效。 char a[5] = { 12,36,96,128,182 }; a[]範圍為-128~127. 數組中128和182均無效。 ...
  • 廢話不多說,直接開乾! 硬體配置 處理器: Intel(R) Core(TM) i5-4690k CPU @3.90GHz 記憶體容量: 8.00 GB 軟體版本 OS: Microsoft Windows 10 HTTP 跑分工具: https://github.com/codesenberg/bo ...
  • 本文主要參考自孫鐘秀主編的《操作系統教程》一書中關於進程和線程的部分。 進程 為什麼引入進程? 一,刻畫系統動態性,發揮系統併發性,提高資源利用率。 以C 為例,在編輯器Visual Studio Code寫了幾行代碼,保存為cs文件。在未運行狀態的下的代碼,稱之為靜態的程式。靜態的程式是一個相對的 ...
  • 1 private void button1_Click(object sender, EventArgs e) 2 { 3 DataTable dt = new DataTable(); 4 dt.Columns.Add("Group"); 5 dt.Columns.Add("id... ...
  • 1.NuGet包管理器中安裝log4net 2.接著在項目中添加log4net.config文件,以及手擼或尋找一個LogHelper 添加完log4net.config一定要設置屬性,將其始終複製到輸出目錄 3.最後需要在AssemblyInfo.cs中添加一行代碼 效果如下: Demo下載:ht ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...