利用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等型別,都是一個可以被拿來快速套用自己想要設定屬性的類別,不需要真的自己實作。

相關連結:

ORM System.Reflection ObjectRelationalMapping PropertyAliasName EntityFramework PCOC PlainOldCLRObject PropertyName 屬性名稱 PropertyAttribute 屬性特性 PropertyValue 屬性值