2009-09-01 3 views
0

Supposons que j'ai une classe nommée Données. Une autre classe annote l'un de ses membres, de type data, avec certains attributs. Par exemple:Obtention d'attributs personnalisés qui ont été définis en dehors de la classe

public class Example{ 

    [DefaultNameAttribute("default name")] 
    public Data Name{get;set} 
} 

Ce que je suis à la recherche est un moyen, à partir de la classe données, pour récupérer cet attribut et les données qu'il contient. Je veux être capable d'écrire le code suivant:

public class Data{ 
    private string _name = null; 
    public string Name{ 
     get{ 
      if (_name != null) return _name; 
      return (getDefaultNameFromAnnotation(this));//this is the method I'm looking for 
     } 
} 

En d'autres termes, je veux être en mesure de donner une valeur par défaut à un champ spécifique à l'aide des attributs personnalisés spécifiés en dehors de ma classe.

Répondre

0

Réponse courte: Vous ne pouvez pas, ou du moins, vous ne devriez pas.

Le DefaultNameAttribute est appliqué sur un membre de type Example, qui est décorrélé de Data type. Il peut y avoir plusieurs types qui utilisent le type Data et plusieurs instances du DefaultNameAttribute. Example peut même être défini dans un autre assemblage, etc.

0

Cela dépend de la façon dont votre attribut est utilisé (si c'est sur une classe, une propriété, une méthode, etc ...). Par exemple, s'il est utilisé sur une classe que vous pouvez obtenir tous les types qui sont marqués avec votre attribut avec le code suivant:

public IEnumerable<Type> GetTypes(Assembly assembly) 
{ 
    foreach(Type type in assembly.GetTypes()) 
    { 
     if (type.GetCustomAttributes(typeof(DefaultNameAttribute), true).Length > 0) 
     { 
      yield return type; 
     } 
    } 
} 

Si elle est utilisée uniquement sur les propriétés (comme exemple), vous pourriez alors nid une instruction supplémentaire foreach qui énumérera toutes les propriétés pour un type donné et recherchera l'attribut.

Questions connexes