2009-05-11 7 views
5

Je cherche à collecter tous les attributs personnalisés placés sur une propriété. Il y a plus d'un des attributs du même type attribué à la propriété, mais quand la collecte, la collection résultant contient le premier attribut du type spécifique:AllowMultiple ne fonctionne pas avec les attributs de propriété?

L'attribut classe

[AttributeUsage(System.AttributeTargets.Property, 
       AllowMultiple = true)] 

public class ConditionAttribute : Attribute{...} 

Utilisation:

[ConditionAttribute("Test1")] 
[ConditionAttribute("Test2")] 
[ConditionAttribute("Test3")] 
public Color BackColor{get; set;} 

maintenant, quand une boucle à travers tous les accessoires de l'objet « valeur » dont la classe contient la Prop « BackColor »:

foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(value)) 
{ 
    foreach (Attribute attribute in property.Attributes) 
    { ... } 
    .... 
} 

la collection propriété.Attributs ne contient qu'un seul attribut de type "ConditionAttribute": celui avec "Test1". Les autres sont ignorés ;-(

Alors ne AllowMultiple pas travailler pour la propriété Attributes?

Merci à l'avance

henrik

Répondre

0

Oui, il fonctionne. Je ne sais pas pourquoi il ne fonctionne pas par propertyDescriptors

Vous pouvez toujours faire:. Attribute.GetCustomAttributes(methodInfo, typeof(ConditionAttribute))

17

Selon a post on MSDN, cette i s par conception dans le cadre de la classe PropertyDescriptor.

Cependant, vous pouvez réellement résoudre le problème en remplaçant TypeId dans votre attribut personnalisé (Merci à Ivan from Mindscape pour avoir signalé):

public override object TypeId 
{ 
    get 
    { 
    return this; 
    } 
} 
+0

J'ai rencontré un problème similaire lors de l'utilisation d'un ValidationAttribute personnalisé dans MVC; Cela a résolu mon problème. –

0

Une autre façon de modifier cela,

[ConditionAttribute (» Test1, Test2, Test3 ")] public Couleur BackColor {get; ensemble;}

et dans votre code de validation,

Dim lstProperties() As String = _ChkColors.Split ("") Pour chaque strProp sous forme de chaîne dans lstPropertyes votre validation 'retour suivant

Questions connexes