利用Attribute為ORM型別的屬性添增屬性別名
前陣子有朋友說看了我之前的C#中的Attribute屬性(特性)用法後,對用法還是不甚了解,本篇文章就以常見的ORM為例子,稍微介紹一下Attribute的用法。這個例子將為ORM型別添加一個別名機制(Property Alias Name),在資料處理的末期別名機制確實有其必要性,例如客戶就是不喜歡叫做ID,偏要以身分證等字眼出現,這時候別名機制就很需要嘍!
一、先建立起一個自訂的Attribute型別
.NET規範Attribute型別名稱最好以Attribute為結尾,但其實不寫也無妨。
public class AliasAttribute : System.Attribute
{
private string _cAliasName = string.Empty;
public AliasAttribute(string cTemp)
{ _cAliasName = cTemp; }
public string cAliasName { get { return _cAliasName; } }
}
從上面的例子可以看出這個型別的名稱為Alias,且在建構子時期就擁有可以變更_cAliasName欄位的能力,另外提供一個可取用欄位的屬性,名為cAliasName。
二、建立起一個範例用的ORM型別
如果你採用的是.NET EF(Entity Framework),那麼ORM型別你應該用很大,我們自定義一個簡單的ORM如下,並賦予給cName、iMoney兩個屬性各自的AliasAttribute,而bSex不賦予的原因是因為等一下要拿來對照測試。
public class ORM
{
[Alias("姓名")]
public string cName { get; set; }
[Alias("金額")]
public int iMoney { get; set; }
public bool bSex { get; set; }
}
三、寫程式提取
首先記得要引用using System.Reflection;、using System.Linq;喔!不然程式碼會動不了。
ORM oTemp = new ORM()
{
cName = "王小明",
iMoney = 9999,
bSex = true
};
var oList = oTemp.GetType().GetProperties().Select(prop => {
//判斷是否存在AliasAttribute
if (prop.IsDefined(typeof(AliasAttribute), true))
{ return $"{prop.Name}:{prop.GetValue(oTemp)} / 別名:{prop.GetCustomAttribute<AliasAttribute>().cAliasName}"; }
else
{ return $"{prop.Name}:{prop.GetValue(oTemp)} / 別名:沒有指定"; }
});
foreach (var oItem in oList)
{
WriteLine(oItem);
}
如此一來,我們就可以輕易的拿到這個ORM的相關資訊啦!
輸出
-----
cName:王小明 / 別名:姓名
iMoney:9999 / 別名:金額
bSex:True / 別名:沒有指定
補充相關型別
如果因為環境的限制不能自己添加型別,或自己不想要寫這個AliasAttribute,其實可以去.NET提供的內建System.ComponentModel名稱空間裡面找找,例如DescriptionAttribute或是CategoryAttribute等型別,都是一個可以被拿來快速套用自己想要設定屬性的類別,不需要真的自己實作。