13 Stimmen

AllowMultiple funktioniert nicht mit Eigenschaftsattributen?

Ich versuche, alle benutzerdefinierten Attribute zu sammeln, die über eine Eigenschaft platziert wurden. Der Eigenschaft sind mehrere Attribute desselben Typs zugewiesen, aber wenn ich sie sammle, enthält die resultierende Sammlung nur das erste Attribut des spezifischen Typs:

Die Klasse Attribut

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

public class ConditionAttribute : Attribute{...}

Verwendung:

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

Wenn Sie nun eine Schleife durch alle Requisiten des Objekts "value" ziehen, dessen Klasse die Requisite "BackColor" enthält:

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

die Sammlung Eigenschaft.Attribute enthält nur EIN Attribut vom Typ "ConditionAttribute": das mit "Test1". Die anderen werden ignoriert;-(

Funktioniert AllowMultiple also nicht für Eigenschaftsattribute?

Vielen Dank im Voraus

henrik

25voto

mcdrewski Punkte 618

Selon ein Beitrag auf MSDN ist dies als Teil der PropertyDescriptor-Klasse vorgesehen.

Sie können das Problem jedoch lösen, indem Sie TypeId in Ihrem benutzerdefinierten Attribut außer Kraft setzen (Dank an Ivan von Mindscape für den Hinweis auf diese Tatsache):

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

0 Stimmen

Ich stieß auf ein ähnliches Problem bei der Verwendung eines benutzerdefinierten ValidationAttribute in MVC; Dies löste mein Problem.

2voto

leppie Punkte 111830

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

Das können Sie immer tun: Attribute.GetCustomAttributes(methodInfo, typeof(ConditionAttribute))

0voto

V K Punkte 1

Eine andere Möglichkeit, dies zu optimieren,

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

und in Ihrem Validierungscode,

Dim lstProperties() As String = _ChkColors.Split(",") For each strProp as string in lstPropertyes ' Ihre Validierung ' Rückgabe Nächste

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X