2009-10-12 16 views
5

Dado lo siguiente, no esperaría que el compilador permita múltiples atributos que se derivan del atributo base, dado que está establecido en AllowMultiple = false. De hecho, se compila sin problemas. ¿Qué me falta aquí?Honrando a AttributeUsage en los tipos de atributos derivados

using System; 

[AttributeUsage(AttributeTargets.Property,AllowMultiple=false,Inherited=true)] 
abstract class BaseAttribute : Attribute { } 

sealed class DerivedAttributeA : BaseAttribute { } 

sealed class DerivedAttributeB : BaseAttribute { } 

    class Sample1 
    { 
     [DerivedAttributeA()] 
     [DerivedAttributeB()] 
     public string PropertyA{ get; set; } // allowed, concrete classes differ 

     [DerivedAttributeA()] 
     [DerivedAttributeA()] 
     public string PropertyB { get; set; } // not allowed, concrete classes the same, honours AllowMultiple=false on BaseAttribute 
    } 

Respuesta

6

El problema es simplemente que el cheque AllowMultiple sólo compara los atributos de la misma real tipo (es decir, el tipo concreto instanciado) - y es quizás el más utilizado con sealed atributos por esta razón.

Será, por ejemplo, hacer cumplir los siguientes (como un duplicado ilegal), heredando esto desde BaseAttribute:

[DerivedAttributeB()] 
[DerivedAttributeB()] 
public string Name { get; set; } 

En resumen, creo que no se puede hacer lo que quiera aquí ... (No aplique más de una instancia incluyendo las subclases de BaseAttribute por propiedad).

Un ejemplo similar de este problema sería:

[Description("abc")] 
[I18NDescriptionAttribute("abc")] 
public string Name { get; set; } 

class I18NDescriptionAttribute : DescriptionAttribute { 
    public I18NDescriptionAttribute(string resxKey) : base(resxKey) { } 
} 

El intento anterior es proporcionar un [Description] de ResX en tiempo de ejecución (el pleno apoyo de ComponentModel etc) - pero no puede parada también agregando un [Description].

+0

Temía que ese fuera el caso, gracias por la confirmación. –

Cuestiones relacionadas