2012-02-19 2 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

이 예를 따르는 데 문제가 있습니다. // No는 어디에서 발생합니까? 그리고 어떤 메소드에 'ObsoleteAttribute'가 정의되어 있습니까? –

+0

더 명확히 말하면, 문제는 오버라이드 된 멤버에 정의 된 속성을 찾는 것입니다. 상속 계층 내에서 해당 멤버에 정의 된 특성을 반환하려는 것으로 가정합니다. – Reddog

답변

2

documentation for MemberInfo.GetCustomAttributes (PropertyInfo에 상속 됨) 상태;

이 메서드는 속성 및 이벤트에 대한 상속 매개 변수를 무시합니다. 속성의 속성 및 이벤트의 상속 체인을 검색하려면 Attribute.GetCustomAttributes 메서드의 적절한 오버로드를 사용하십시오.

즉, 설계 상 (잘못된) 동작입니다.

+0

또한 발견했습니다 : 상속 - 형식 : System.Boolean - 특성을 찾기 위해이 멤버의 상속 체인을 검색하려면 true이고, 그렇지 않으면 false입니다. 그렇지 않으면 false입니다. **이 매개 변수는 속성 및 이벤트에서 무시됩니다. 비고 참조. ** - 감사합니다. – Tarion