[C#] 取得欄位的資料標記 Data Annotation from Metadata Class
通常我們建立好Entity Model
就會再幫他建立一個Metadata類別來存放資料標記
那要如何取得這些資料標記呢?
只要利用AssociatedMetadataTypeTypeDescriptionProvider類別
就可以取得任何我們想要的資料標記
這邊我建立一個擴充方法來示範
註:這裡沒做任何的資料處理,純示範如何取得資料標記
public static class Extension
{
public static void GetDataAnnotation<T>(this IQueryable<T> data)
{
var props = new AssociatedMetadataTypeTypeDescriptionProvider(typeof(T)).GetTypeDescriptor(typeof(T)).GetProperties();
foreach (PropertyDescriptor p in props)
{
//取Required標記
var r = p.Attributes.OfType<RequiredAttribute>().FirstOrDefault();
//取DisplayName標記
var d = p.Attributes.OfType<DisplayNameAttribute>().FirstOrDefault();
//取StringLength標記
var s = p.Attributes.OfType<StringLengthAttribute>().FirstOrDefault();
}
}
}
下圖是在Debug中的觀察
可以從這裡看到資料標記和他的內容都取出來了
這裡如果要取DisplayName標記有個更快的方式
直接取用p.DisplayName即可
另外像是自訂的資料標記
如下圖,該標記裡還有三個屬性A, B, C
替欄位加上自訂的資料標記
一樣可以輕鬆取得
最後再分享一個快速建立Metadata Class的方法
當你建立好Entity Model後
先按F6建置方案
然後再按右鍵新增項目
新增"Domain Service Class"類別(如果你沒有這個類別,請參考這裡安裝Silverlight4 Tools)
名稱自取,這裡我用Customer.cs做示範
然後他會自動連結你現有的Entity Model
選擇你要建立的資料表
這裡我以Customers資料表做示範
下方的Generate associated classes for metadata記得打勾
然後他就會在方案總管裡產生兩個檔案Customer.cs和Customer.metadata.cs
Customer.metadata.cs就是我們要的Metadata Class了
留下他,並刪掉Customer.cs
看哪~欄位都幫我們建立好了
我們只需要打上資料標記即可
註:MetadataTypeAttribute和MetadataType是一樣的標記,Attribute其實是可以省略不寫的