2012-04-27 53 views
5

đang Thuộc tínhthuộc tính thừa kế

[AttributeUsage(AttributeTargets.Property, Inherited = true)] 
class IgnoreAttribute : Attribute 
{ 
} 

class Base

abstract class ManagementUnit 
{ 
    [Ignore] 
    public abstract byte UnitType { get; } 
} 

lớp Main

class Region : ManagementUnit 
{ 
    public override byte UnitType 
    { 
     get { return 0; } 
    } 

    private static void Main() 
    { 
     Type t = typeof(Region); 
     foreach (PropertyInfo p in t.GetProperties()) 
     { 
      if (p.GetCustomAttributes(typeof(IgnoreAttribute), true).Length != 0) 
       Console.WriteLine("have attr"); 
      else 
       Console.WriteLine("don't have attr"); 
     } 
    } 
} 

Đầu ra:don't have attr

Giải thích lý do tại sao điều này xảy ra? Sau khi tất cả, nó phải thừa kế.

Trả lời

5

Cờ kế thừa ra lệnh cho dù thuộc tính có thể được kế thừa hay không. Giá trị mặc định cho giá trị này là sai. Tuy nhiên, nếu cờ được kế thừa là được đặt thành true, nghĩa của nó phụ thuộc vào giá trị của cờ AllowMultiple . Nếu cờ được kế thừa được đặt thành true và cờ AllowMultiple là sai, thuộc tính sẽ ghi đè thuộc tính được kế thừa. Tuy nhiên, nếu cờ được kế thừa được đặt thành true và cờ AllowMultiple cũng được đặt thành true, thuộc tính sẽ tích lũy trên thành viên.

từ http://aclacl.brinkster.net/InsideC/32ch09f.htm Kiểm tra chương Xác định thừa kế thuộc tính Rules

EDIT: kiểm tra Inheritance of Custom Attributes on Abstract Properties Câu trả lời đầu tiên:

Đó là GetCustomAttributes() phương pháp mà không nhìn vào cha mẹ tờ khai. Nó chỉ xem xét các thuộc tính được áp dụng cho thành viên được chỉ định.

+3

Không, mặc định cho "được kế thừa" là đúng. https://msdn.microsoft.com/en-us/library/system.attributeusageattribute.inherited(v=vs.110).aspx – 00jt

0

Các thừa kế cờ trong PropertyInfo.GetCustomAttributes bị bỏ qua cho cả các thuộc tính và các sự kiện như tài liệu theo: https://msdn.microsoft.com/en-us/library/dwc6ew1d.aspx. Nhưng bạn có thể sử dụng một trong các quá tải Attribute.GetCustomAttributes để cho phép thừa kế các thuộc tính (hoặc các sự kiện).

Vấn đề này được thảo luận chi tiết hơn trong: http://blog.seancarpenter.net/2012/12/15/getcustomattributes-and-overridden-properties/

Các vấn đề liên quan