[C#]使用自訂的Attribute來增加程式的彈性

在C#中,可以透過自訂Attribute來增加寫程式時的彈性,像是使用Enum,可以再多增加別的參數供我們使用

這邊介紹如何使用自訂的屬性,並透過反射來取得自訂屬性的參數值

Attribute設計

我使用一個Enum當作範例,目標是在Enum的屬性中掛上自訂的Attribute,能夠使用別名

public enum MessageType
{
    /// <summary>The mail.</summary>
    [Alias("電子郵件")]
    Mail,

    /// <summary>The sms.</summary>
    [Alias("簡訊")]
    Sms,

    /// <summary>The line.</summary>
    [Alias("Line訊息")]
    Line,
}

這個Enum很簡單,就是個訊息類型的Enum。[Alias("")]就是我們等一下要實作的AliasAttribute

/// <summary>The custome attribute.</summary>
public class AliasAttribute : Attribute
{
    /// <summary>The _alias.</summary>
    private readonly string _alias;

    /// <summary>Gets the alias.</summary>
    public string Alias
    {
        get
        {
            return this._alias;
        }
    }

    /// <summary>Initializes a new instance of the <see cref="AliasAttribute"/> class.</summary>
    /// <param name="alias">The alias.</param>
    public AliasAttribute(string alias)
    {
        this._alias = alias;
    }
}

AliasAttribute的實作很簡單,只提供一個Alias。在這個class的constructor中,其實就是[Alias("")]中要填入的值,你可以依照自身的需求增加。

使用Reflection來取得Attribute的值

Reflection來取得Enum的Attriubte,並轉型成AliasAttribute,取出我們要的Alias

這邊我設計成ExtensionMethod,接下來程式在使用Enum時,就可以很方便的使用

public static class AttributeExtension
{
    /// <summary>The get alias.</summary>
    /// <param name="type">The type.</param>
    /// <returns>The <see cref="string"/>.</returns>
    public static string GetAlias(this Enum type)
    {
        FieldInfo fi = type.GetType().GetField(type.ToString());
        var attribute = fi.GetCustomAttribute(typeof(AliasAttribute), false) as AliasAttribute;

        if (attribute != null)
        {
            return attribute.Alias;
        }

        return type.ToString();
    }
}

來試試看使用效果吧!

單元測試通過,代表是可以work的!

將來在程式中只要使用MessageType.Mail.Alias就可以取得Attribute的別名了,我也會使用這個方式來替Enum的屬性加入多國語系的支援。

如果有更好的做法也歡迎分享給我知道

範例程式

參考資料

Microsoft DOC - Attribute介紹