5

Trong câu trả lời cho this question Tôi đã cố gắng sử dụng Type.GetCustomAttributes(true) trên một lớp thực hiện giao diện có Thuộc tính được xác định trên đó. Tôi đã rất ngạc nhiên khi phát hiện ra rằng GetCustomAttributes không trả lại thuộc tính được xác định trên giao diện. Tại sao không? Không phải là một phần giao diện của chuỗi thừa kế?Trong .Net, tại sao các thuộc tính không được khai báo trên các giao diện trả lại khi gọi Type.GetCustomAttributes (true)?

Mẫu mã:

[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 
{ 
} 

Đầu ra: Không có gì

Trả lời

8

I don không tin rằng các thuộc tính được định nghĩa trên các giao diện được triển khai có thể được thừa kế hợp lý. Hãy xem xét trường hợp này:

[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 { } 

Vì thuộc tính chỉ định rằng bội số không được phép, bạn mong đợi tình huống này được xử lý như thế nào?

+0

Ok, điều đó có ý nghĩa. Tôi đã không nghĩ về việc làm thế nào để cho phép điều này giống như việc mở nhiều ổ thừa kế của giun. Câu trả lời tốt! –

+0

Xin cảm ơn! Tôi thích trả lời các câu hỏi với nhiều câu hỏi hơn. :) – cdhowie

4

Bởi vì loại DoesntOverrideAttr không có bất kỳ thuộc tính tùy chỉnh. Giao diện mà nó thực hiện (nhớ, một lớp không kế thừa từ một giao diện ... nó thực hiện nó để nhận các thuộc tính lên chuỗi thừa kế vẫn sẽ không bao gồm các thuộc tính từ các giao diện):

// 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()); 
}