2009-10-12 11 views
5

Aşağıdakileri göz önüne alarak, derleyicinin AllowMultiple = false olarak ayarlandığında, temel öznitelikten türetilen birden çok özniteliğe izin vermesini beklemezdim. Aslında sorun olmadan derler - burada ne eksik?Türetilmiş öznitelik türleri üzerinde AttributeUsage onurlandırma

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 
    } 

cevap

6

sorun AllowMultiple kontrolü sadece aynı gerçek tip (diğer bir deyişle beton tipi örneği) özelliklerini karşılaştırır sadece - ve belki de en iyi bu nedenle sealed özellikleri ile kullanılır.

Bu, örneğin, zorunlu kılar BaseAttribute bu miras, (yasadışı kopyası olarak) aşağıdaki: Kısacası

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

, seni burada istediğinizi yapabilirsiniz sanmıyorum ... (mülk başına alt alt kategorileri dahil olmak üzere birden fazla örneğini uygulamayın).

bu sorunun benzer bir örnek verilebilir:

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

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

Yukarıdaki amacı (tam ComponentModel vs ile desteklenir) zamanında ResX bir [Description] sağlamaktır - aynı zamanda olamaz durağı ancak [Description] ekleyerek.

+0

Bu durumdan endişeleniyorum, onay için teşekkürler. –