在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的屬性加入多國語系的支援。
如果有更好的做法也歡迎分享給我知道