2008-12-24 9 views
18

Je suis en train de construire un objet à travers un attribut sur une propriété de classes qui spécifie une colonne dans une ligne de données fournie qui est la valeur de la propriété, comme ci-dessous:C# définir des valeurs de propriété par la réflexion avec des attributs

[StoredDataValue("guid")] 
    public string Guid { get; protected set; } 

    [StoredDataValue("PrograGuid")] 
    public string ProgramGuid { get; protected set; } 

dans une méthode build() sur un objet de base, je reçois les valeurs d'attribut définies sur ces propriétés comme

 MemberInfo info = GetType(); 
     object[] properties = info.GetCustomAttributes(true); 

Cependant, à ce stade, je réalise la limitation de ma connaissance.

Pour commencer, je ne semble pas récupérer les attributs corrects.

Et comment puis-je définir ces propriétés par réflexion, maintenant que j'ai les attributs? Est-ce que je fais/pense quelque chose de fondamentalement incorrect?

Répondre

38

Il y a deux questions distinctes ici

  • typeof(MyClass).GetCustomAttributes(bool) (ou GetType().GetCustomAttributes(bool)) retourne les attributs de la classe elle-même, et non pas les attributs sur les membres. Vous devrez appeler typeof(MyClass).GetProperties() pour obtenir la liste des propriétés de la classe, puis vérifier chacune d'entre elles. Une fois que vous avez la propriété, je pense que vous devriez utiliser Attribute.GetCustomAttribute() au lieu de MemberInfo.GetGustomAttributes() puisque vous savez exactement quel attribut vous recherchez.

Voici un petit extrait de code pour vous aider à démarrer:

PropertyInfo[] properties = typeof(MyClass).GetProperties(); 
foreach(PropertyInfo property in properties) 
{ 
    StoredDataValueAttribute attribute = 
     Attribute.GetCustomAttribute(property, typeof(StoredDataValueAttribute)) as StoredDataValueAttribute; 

    if (attribute != null) // This property has a StoredDataValueAttribute 
    { 
     property.SetValue(instanceOfMyClass, attribute.DataValue, null); // null means no indexes 
    } 
} 

EDIT: Ne pas oublier que Type.GetProperties() ne retourne propriétés publiques par défaut. Vous devrez utiliser Type.GetProperties(BindingFlags) pour obtenir d'autres types de propriétés.

+0

Je vais vous donner qu'un test et vous faire savoir, semble logique que – johnc

+0

Attribute.GetCustomAttribute (...) retourne un tableau de System.Attribute et ne peut pas être simplement jeté à l'attribut lui-même. L'exemple montré ne compile même pas encore travailler. Vous devez tester la longueur du tableau pour voir si l'attribut désiré existe et convertir le premier élément en le type requis à la place. –

+0

L'exemple utilise GetCustomAttribute, pas GetCustomAttributes. L'exemple compile lorsque je l'essaie (bien sûr, en changeant le nom de l'attribut). –