[C#] 取得欄位的資料標記 Data Annotation from Metadata Class

  • 13756
  • 0
  • C#
  • 2010-07-12

[C#] 取得欄位的資料標記 Data Annotation from Metadata Class

通常我們建立好Entity Model

就會再幫他建立一個Metadata類別來存放資料標記

image

 

那要如何取得這些資料標記呢?

只要利用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中的觀察

可以從這裡看到資料標記和他的內容都取出來了

image

 

這裡如果要取DisplayName標記有個更快的方式

直接取用p.DisplayName即可

image

 

另外像是自訂的資料標記

如下圖,該標記裡還有三個屬性A, B, C

image

 

替欄位加上自訂的資料標記

image

 

一樣可以輕鬆取得

image

 

最後再分享一個快速建立Metadata Class的方法

當你建立好Entity Model後

先按F6建置方案

然後再按右鍵新增項目

新增"Domain Service Class"類別(如果你沒有這個類別,請參考這裡安裝Silverlight4 Tools

名稱自取,這裡我用Customer.cs做示範

image

 

然後他會自動連結你現有的Entity Model

選擇你要建立的資料表

這裡我以Customers資料表做示範

下方的Generate associated classes for metadata記得打勾

image

 

然後他就會在方案總管裡產生兩個檔案Customer.cs和Customer.metadata.cs

Customer.metadata.cs就是我們要的Metadata Class了

留下他,並刪掉Customer.cs

image

 

看哪~欄位都幫我們建立好了

我們只需要打上資料標記即可

註:MetadataTypeAttribute和MetadataType是一樣的標記,Attribute其實是可以省略不寫的

image