2016-04-11 13 views
1

Ich benutze Entity Framework und hier ist, wie die Metadaten für eine der Tabellen aussieht.Get Spaltenname der Entität

[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; } 

Ich habe Interesse der Spalte Attributnamen anstelle des öffentlichen Namen in immer, das heißt Display pp_added statt „AddDate“. Hier ist eine foreach-Schleife die ich geschrieben habe, so weit, dass mich fast bekommt es

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"); 
} 

Hier ist, was zurückgegeben wird:

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

Was ich möchte zurück zu bekommen, ist

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

Wie kann ich auf [Column("pp_added")] zugreifen, um pp_added anstelle der öffentlichen Name zu bekommen?

+0

Sie müssen Reflexion verwenden. Weitere Informationen finden Sie unter http://stackoverflow.com/questions/9113020/get-attribute-info-with-generics. – mit

+0

Der reflektionsbasierte Ansatz funktioniert nicht in einem flüssigen API-Fall. Sie müssen EF-Metadaten untersuchen. – Dennis

Antwort

4

sollte diese Arbeit:

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"); 
} 

Die ColumnAttribute ist im System.ComponentModel.DataAnnotations.Schema Namespace.

+0

Aber er sagt "field.Name" gibt nicht den erwarteten Wert zurück. –

+0

Ich verwende nicht 'Name' Eigenschaft des Feldes, sondern des Spaltenattributs –

+0

Vielen Dank. Das hat den Trick gemacht. Ich bin so dankbar für deine Hilfe. –

1

Neben Alexander Antwort, dies wird den zugrunde liegenden Typen für die Nullable Type erhalten:

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

Nullable.GetUnderlyingType wird den zugrunde liegenden Typen zurück, wenn es NULL sein kann (dh es wird DateTime zurückkehren, DateTime? falls angegeben), oder null zurückgeben, wenn keine NULL-Werte zulässig sind. Daher der Ausdruck ??.

+0

Das würde meine nächste Frage sein, wenn ich es nicht finden könnte. Danke für die Antwort im Voraus und spart mir die 2 Tage suchen und versuchen. Ich schätze es sehr. –

Verwandte Themen