2009-05-11 10 views
5

Ich bin dabei, alle benutzerdefinierten Attribute zu sammeln, die über eine Eigenschaft platziert werden. Es gibt mehr als ein Attribut des gleichen Typs zum Immobil zugewiesen, aber wenn sie zu sammeln, die ich ergebende Sammlung enthält nur das erste Attribut des spezifischen Typs:AllowMultiple funktioniert nicht mit Eigenschaftsattributen?

Die Attributklasse

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

public class ConditionAttribute : Attribute{...} 

Verbrauch:

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

wenn nun durch alle Requisiten des Objekts ‚Wert‘, dessen Klasse enthält die Stütze „Backcolor“ Looping:

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

die Sammlung property.Attributes enthält nur ein Attribut vom Typ "ConditionAttribute": Das mit "Test1". Die anderen werden ignoriert ;-(

So funktioniert AllowMultiple nicht für Immobilien arbeiten Attribute?

Vielen Dank im Voraus

henrik

Antwort

0

Ja, es funktioniert. Nicht sicher, warum es nicht funktioniert über propertyDescriptors

Sie können jederzeit tun. Attribute.GetCustomAttributes(methodInfo, typeof(ConditionAttribute))

17

nach a post on MSDN dieses i s als Teil der PropertyDescriptor-Klasse.

Allerdings können Sie lösen das Problem tatsächlich durch TypeId in Ihrem benutzerdefinierten Attribut überschrieben (Dank Ivan from Mindscape für diesen Hinweis):

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

Ich habe ein ähnliches Problem bei der Verwendung eines benutzerdefinierten ValidationAttribute in MVC festgestellt; Das hat mein Problem gelöst. –

0

Ein anderer Weg, dies zu optimieren,

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

und in Ihrem Validierungscode,

Dim lstProperties() As String = _ChkColors.Split ("") Für jede strProp als String in lstPropertyes 'Validierer ' Rückkehr Weiter