2009-07-27 13 views
10

hedefliyor. Bu, yorumda gösterilen, kolayca sabitlenen bir derleyici hatası oluşturdu.belirtin gerekli temel sınıf I alt sınıf bıraktığı aşağıda ancak yanlışlıkla koduyla özel NET özellik yaratmak için çalıştı

// results in compiler error CS0641: Attribute 'AttributeUsage' is 
// only valid on classes derived from System.Attribute 
[AttributeUsage(AttributeTargets.Class)] 
internal class ToolDeclarationAttribute 
{ 
    internal ToolDeclarationAttribute() 
    { 
    } 
} 

Sorum derleyici [AttributeUsage] niteliği yalnızca System.Attribute bir alt sınıfa uygulanabilir biliyor mu nasıl? .NET yansıtıcı ben AttributeUsageAttribute sınıf bildirimi üzerine özel bir şey görmüyorum kullanma. Ne yazık ki bu sadece derleyici tarafından üretilen özel bir durum olabilir.

[Serializable, ComVisible(true), AttributeUsage(AttributeTargets.Class, Inherited=true)] 
public sealed class AttributeUsageAttribute : Attribute 
{ 
    ... 
benim özel niteliği yalnızca belirli sınıfın (ya arayüzünün) sınıfının alt yerleştirilebilir belirtmek edebilmek istiyorum

. Mümkün mü?

+0

kullanabilirsiniz. Sınıf düzeyinde meta verileri bir parametre olarak iletmeniz gerektiğinde, aynı işlevleri gerçekleştirir. Yani eğer örnekler kolayca söyleyebildiyse, bir şey sayılırsa, arayüz bunu elde etmek için bir kamu mülkiyetini gerektirebilir. Sınıf seviyesinde olması gerekiyorsa, Attributes ile kaldınız. –

cevap

26

Özel özniteliğimin yalnızca belirli bir sınıfın (veya arabirimin) alt sınıflarına yerleştirilebileceğini belirtmek isterim. Mümkün mü? Restricting Attribute Usage bkz -

Aslında protected kullanarak alt sınıflara (ancak arayüzler) için bunu yapmanın bir yolu yoktur. kodunu (ancak tartışma) çoğaltmak için: ReSharper ile

abstract class MyBase { 
    [AttributeUsage(AttributeTargets.Property)] 
    protected sealed class SpecialAttribute : Attribute {} 
} 
class ShouldBeValid : MyBase { 
    [Special] // works fine 
    public int Foo { get; set; } 
} 
class ShouldBeInvalid { // not a subclass of MyBase 
    [Special] // type or namespace not found 
    [MyBase.Special] // inaccessible due to protection level 
    public int Bar{ get; set; } 
} 
+0

Mükemmel teşekkürler! Dürüst olmak gerekirse, derleyici hatası elde edene kadar bunu yapmayı hiç düşünmedim ama kesinlikle çözümünüz olacak. –

2

AttributeUsageAttribute (Attribute gibi kendisi) sadece sihirli sınıftır. Bu yerleşik bir derleyici kuralıdır ve kendi öznitelikleriniz için böyle bir şey yapamazsınız.

0

Eğer Bu kısıtlama bazen bunun yerine bir işaretleyici Arayüzü kullanarak gereken işaretidir [JetBrains.Annotations.BaseTypeRequired(typeof(YouBaseType))]