2009-05-11 17 views
5

Estoy intentando recoger todos los atributos personalizados colocados sobre una propiedad. Hay más de un Atributos del mismo tipo asignado a la propiedad, pero cuando su recogida, la colección resultante sólo contiene el primer atributo del tipo específico:AllowMultiple no funciona con atributos de propiedad?

el atributo de clase

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

public class ConditionAttribute : Attribute{...} 

Uso:

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

Ahora, cuando bucle a través de todos los pilares del 'valor' objeto cuya clase contiene la Prop "BackColor":

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

la propiedad de la colección .Los atributos solo contienen UN atributo del tipo "ConditionAttribute": El que tiene "Test1". Los otros son ignorados ;-(

Entonces, ¿allowMultiple no funciona para la propiedad atributos?

Gracias de antemano

Henrik

Respuesta

0

Sí, funciona. No sé por qué no funciona a través de PropertyDescriptors

siempre se puede hacer:. Attribute.GetCustomAttributes(methodInfo, typeof(ConditionAttribute))

17

Según a post on MSDN, esto i s por diseño como parte de la clase PropertyDescriptor.

Sin embargo, en realidad se puede resolver el problema reemplazando TypeId en su atributo personalizado (Gracias a Ivan from Mindscape por señalar esto):

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

Encontré un problema similar al usar un ValidationAttribute personalizado en MVC; esto resolvió mi problema –

0

Otra manera de ajustar esto,

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

y en el código de validación,

lstProperties Dim() As String = _ChkColors.Split ("") Para cada strProp como cadena en lstPropertyes 'su validación ' volver Siguiente

Cuestiones relacionadas