2016-04-11 127 views
1

我正在使用實體框架,這裏是其中一個表的元數據外觀。獲取實體的列名

[Column("pp_account")] 
    public string Account { get; set; } 
    [Column("pp_added")] 
    public DateTime? AddDate { get; set; } 
    [Column("pp_auser")] 
    public string AddUpdateUserName { get; set; } 
    [Column("pp_cfalt")] 
    public string AlternateForwardingNumber { get; set; } 

我有興趣獲取Column屬性名稱而不是公共名稱,即顯示pp_added而不是「AddDate」。這裏是一個foreach循環我已經寫到目前爲止,幾乎讓我有

foreach(var field in _personal.GetType().GetProperties()) 
{ 
      sb.Append("\nName   : " + field.Name + "\n"); 
      sb.Append("Type  : " + field.PropertyType.Name + "\n"); 
      sb.Append("Attributes: " + field.Attributes + "\n"); 
      sb.Append("Value  : " + field.GetValue(_personal, null) + "\n"); 
} 

下面是返回什麼:

Name: AddDate 
Type: Nullable'1 
Attributes: None 
Value: 5/2/2014 12:00:00 AM 

我希望得到什麼回是

Name: pp_added 
Type: Date 
Value: 5/2/2014 12:00:00 AM 

如何訪問[Column("pp_added")]以獲取pp_added而不是公衆Name

+0

您需要使用反射。有關詳細信息,請參閱http://stackoverflow.com/questions/9113020/get-attribute-info-with-generics – mit

+0

基於反射的方法在流利的API情況下不起作用。你需要探索EF元數據。 – Dennis

回答

4

這應該工作:

foreach(var field in _personal.GetType().GetProperties()) 
{ 
    sb.Append("\nName  : " + field.GetCustomAttribute<ColumnAttribute>().Name + "\n"); 
    sb.Append("Type  : " + field.PropertyType.Name + "\n"); 
    sb.Append("Value  : " + field.GetValue(_personal, null) + "\n"); 
} 

ColumnAttribute是在System.ComponentModel.DataAnnotations.Schema命名空間。

+0

但他說「field.Name」不會返回預期值。 –

+0

我沒有使用該字段的名稱屬性,但列屬性爲 –

+0

非常感謝。那就是訣竅。我非常感謝你的幫助。 –

1

除了亞歷山大的回答,這將讓底層的類型可空類型:

sb.Append("Type  : " + (Nullable.GetUnderlyingType(field.PropertyType) ?? field.PropertyType).Name + "\n"); 

Nullable.GetUnderlyingType將返回底層的類型,如果它是空(也就是說它會返回DateTime,如果給DateTime?)或者如果不可爲空則返回null。因此,??表達式。

+0

這是我的下一個問題,如果我找不到它。提前感謝您的答案,並節省了我在尋找和嘗試的兩天時間。我非常感謝。 –