2010-11-10 12 views
5

this question cevabında, üzerinde bir Öznitelik tanımlanmış bir arabirimi uygulayan bir sınıfta Type.GetCustomAttributes(true) kullanmayı denedim. GetCustomAttributes'un, arabirimde tanımlanan özniteliği geri döndürmediğini keşfetmeye şaşırdım. Neden olmasın Miras zincirinin bir parçası değil mi?InNet, neden Type.GetCustomAttributes (true) çağrılırken döndürülen arabirimlerde açıklanan özellikler değildir?

örnek kod:

[Attr()] 
public interface IInterface { } 

public class DoesntOverrideAttr : IInterface { } 

class Program 
{ 
    static void Main(string[] args) 
    { 
     foreach (var attr in typeof(DoesntOverrideAttr).GetCustomAttributes(true)) 
      Console.WriteLine("DoesntOverrideAttr: " + attr.ToString()); 
    } 
} 

[AttributeUsage(AttributeTargets.All, Inherited = true)] 
public class Attr : Attribute 
{ 
} 

Çıkışlar: Hiçbir şey

cevap

8

ı don: Bu mu uygulayan Arayüzü (hatırlamak, bir sınıf o yüzden alıyorum arayüzleri gelen özelliklerini içermez hala miras zincirinde yukarı niteliklerini uygulayan ... bir arayüz devralan etmez) Uygulanan arayüzler üzerinde tanımlanan niteliklerin makul ölçüde miras alınabileceğine inanmayın. Bu durum düşünün:

[AttributeUsage(Inherited=true, AllowMultiple=false)] 
public class SomethingAttribute : Attribute { 
    public string Value { get; set; } 

    public SomethingAttribute(string value) { 
     Value = value; 
    } 
} 

[Something("hello")] 
public interface A { } 

[Something("world")] 
public interface B { } 

public class C : A, B { } 

nitelik katları yasak olduğunu belirten yana, nasıl bu durumun ele alınması beklenebilir?

+0

Tamam, bu mantıklı. Buna izin vermenin, çok-mirasçı solucanların açılmasını nasıl sağlayacağını düşünmemiştim. İyi cevap! –

+0

Teşekkürler! Daha fazla soru ile soruları yanıtlamayı seviyorum. :) – cdhowie

4

tip DoesntOverrideAttr herhangi bir özel özellikleri içermediğinden çünkü.

// This code doesn't check to see if the type implements the interface. 
// It should. 
foreach(var attr in typeof(DoesntOverrideAttr) 
         .GetInterface("IInterface") 
         .GetCustomAttributes(true)) 
{ 
    Console.WriteLine("IInterface: " + attr.ToString()); 
} 
İlgili konular