2010-02-03 9 views
0

J'ai donc ajouté avec enthousiasme l'espace de noms System.ComponentModel.DataAnnotations à mon modèle.Lors de la création d'une aide DataGrid, comment accéder aux nouveaux attributs d'annotation de données à l'aide de Reflection?

J'ai ajouté des choses telles que:

[Required] [DisplayName("First Name")] 
public string first_name {get;set;} 

Je aime vraiment ces attributs parce qu'ils me sauver d'avoir à écrire T4 personnalisé et/ou modifier fortement vues. De cette façon, je peux régénérer une vue confiante qu'il ajoutera les noms d'affichage que je veux, etc.

Le problème est survenu quand j'ai commencé à construire un assistant DataGrid inspiré par celui de ASP.NET MVC2 déchaîné.

Dans cette aide, Stephen utilise la réflexion pour obtenir les en-têtes de colonne.

var value=typeOf(T).GetProperty(columnName).GetValue(item,null) ?? String.Empty; 

Eh bien, le problème est que je ne veux pas récupérer le nom de la propriété. Je veux récupérer la valeur de l'attribut DisplayName.

Ma première tentative à ceci était de regarder à l'intérieur de la propriété Attributs de la classe PropertyInfo. Malheureusement, aucune des annotations de données n'apparaît en tant qu'attribut.

Existe-t-il un moyen de récupérer les annotations de données en utilisant la réflexion?

Merci,

Ron

Répondre

0
var attributes = (DisplayNameAttribute[])typeof(T) 
    .GetProperty(columnName) 
    .GetCustomAttributes(typeof(DisplayNameAttribute), true); 

// TODO: check for null and array size 
var displayName = attributes[0].DisplayName; 
0
public static void BuildGrid<T>(IEnumerable<T> items) 
    {    
     var metadataTypes = typeof(T).GetCustomAttributes(typeof(MetadataTypeAttribute), true); 
     if (metadataTypes.Any()) 
     { 
      foreach (var metaProp in (metadataTypes[0] as MetadataTypeAttribute).MetadataClassType.GetProperties()) 
      { 
       var objProp = typeof(T).GetProperties().Single(x => x.Name == metaProp.Name); 
       var displayNames = metaProp.GetCustomAttributes(typeof (DisplayNameAttribute), true); 
       if (displayNames.Any()) 
       { 
        var displayName = (displayNames[0] as DisplayNameAttribute).DisplayName;       
        foreach (var item in items) 
         var value = objProp.GetValue(item, null);        
       } 
      }     
     } 
    } 
Questions connexes