2012-02-19 4 views
0
using System; 

class Program 
{ 
    static void Main() 
    { 
     var p = typeof(MyClass2).GetProperty("Value"); 
     var a = Attribute.GetCustomAttribute(p, typeof(ObsoleteAttribute), true); 
     Console.WriteLine(a != null); 
    } 
} 

public class MyClass 
{ 
    [CommandProperty()] 
    public virtual string Value { get; set; } 
} 

public class MyClass2 : MyClass 
{ 
    public override string Value { get; set; } 
} 

[AttributeUsage(AttributeTargets.Property, Inherited = true)] 
public class CommandPropertyAttribute : Attribute 
{ 
/* ... */ 
} 

PropertyInfo prop = ***The PropertyInfo of MyClass2.Value***; 
object[] attrs = prop.GetCustomAttributes(typeofCPA, true); 
Attribute at =Attribute.GetCustomAttribute(prop, typeofCPA, true); 
if (attrs.Length == 0 && at != null) 
{ 
    // Yes this happens.   
} 

Почему я не получаю никакого результата от первого вызова GetCustomAttributes?Различное поведение при получении атрибутов переопределенных свойств?

+0

Неполадка после этого примера. Где // Нет, не происходит? И на каком методе определяется «ObsoleteAttribute»? –

+0

Чтобы быть более понятным, кажется, что проблема заключается в нахождении атрибута, определенного на переопределенном элементе. Я предполагаю, что вы хотите вернуть атрибуты, определенные для этого элемента, в любом месте иерархии наследования. – Reddog

ответ

2

Состояние: documentation for MemberInfo.GetCustomAttributes (унаследовано от PropertyInfo);

Этот метод игнорирует параметр наследования для свойств и событий. Чтобы найти цепочку наследования для атрибутов свойств и события , используйте соответствующие перегрузки метода атрибутов Attribute.GetCustomAttributes.

Другими словами, (неправильное) поведение по дизайну.

+0

Кроме того я нашел это: inherit - Тип: System.Boolean - true для поиска цепочек наследования этого члена, чтобы найти атрибуты; в противном случае - false. ** Этот параметр игнорируется для свойств и событий; см. Примечания. ** - Спасибо – Tarion

Смежные вопросы