首頁 > 軟體

C#獲取Description特性的擴充套件類詳解

2022-06-24 10:02:05

C#中Description特性主要用於列舉和屬性,方法比較簡單,記錄一下以便後期使用。

擴充套件類DescriptionExtension程式碼如下:

using System;
using System.ComponentModel;
using System.Reflection;
 
/// <summary>
/// 描述特性的讀取擴充套件類
/// </summary>
public static class DescriptionExtension
{
    /// <summary>
    /// 獲取列舉的描述資訊
    /// </summary>
    public static string GetDescription(this Enum em)
    {
        Type type = em.GetType();
        FieldInfo fd = type.GetField(em.ToString());
        string des = fd.GetDescription();
        return des;
    }



    /// <summary>
    /// 獲取屬性的描述資訊
    /// </summary>
    public static string GetDescription(this Type type, string proName)
    {
        PropertyInfo pro = type.GetProperty(proName);
        string des = proName;
        if (pro != null)
        {
            des = pro.GetDescription();
        }
        return des;
    }



    /// <summary>
    /// 獲取屬性的描述資訊
    /// </summary>
    public static string GetDescription(this MemberInfo info)
    {
        var attrs = (DescriptionAttribute[])info.GetCustomAttributes(typeof(DescriptionAttribute), false);
        string des = info.Name;
        foreach (DescriptionAttribute attr in attrs)
        {
            des = attr.Description;
        }
        return des;
    }
}

使用方法:

[Description("測試列舉名")]
enum TestEnum 
{
    [Description("測試")]
    Test1 
}

[Description("測試類名")]
class TestClass
{
    [Description("測試class")]
    public int Test1 { get; set; }
}

//獲取列舉型別的描述特性
string str1 = typeof(TestEnum).GetDescription();

//獲取列舉值的描述特性
string str2 =TestEnum.Test1.GetDescription();
str2 = typeof(TestEnum).GetDescription(nameof(TestEnum.Test1));
str2 = typeof(TestEnum).GetDescription(TestEnum.Test1.ToString());

//獲取類的描述特性
string str3 = typeof(TestClass).GetDescription();

//獲取屬性的描述特性(也可以反射遍歷屬性列表)
string str4 = typeof(TestClass).GetDescription();
TestClass test = new TestClass();
str4 = typeof(TestClass).GetDescription(nameof(test.Test1));

補充:

C#利用擴充套件方法獲得列舉的Description

/// <summary>
/// 擴充套件方法,獲得列舉的Description
/// </summary>
/// <param name="value">列舉值</param>
/// <param name="nameInstead">當列舉值沒有定義DescriptionAttribute,是否使用列舉名代替,預設是使用</param>
/// <returns>列舉的Description</returns>
public static string GetDescription(this Enum value, Boolean nameInstead = true)
{
    Type type = value.GetType();
    string name = Enum.GetName(type, value);
    if (name == null)
    {
        return null;
    }
  
    FieldInfo field = type.GetField(name);
    DescriptionAttribute attribute = System.Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
  
    if (attribute == null && nameInstead == true)
    {
        return name;
    }
    return attribute?.Description;
}

隨便整一個列舉

public enum ModuleType
 {
     /// <summary>
     /// 中國
     /// </summary>
     [Description("中國")]
     ZH = 1,
     /// <summary>
     /// 美國
     /// </summary>
     [Description("美國")]
     MG = 2
 }

到此這篇關於C#獲取Description特性的擴充套件類詳解的文章就介紹到這了,更多相關C#獲取Description特性內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com