는 다음과 같은 시나리오를 생각해보십시오 :사용자 지정 특성 클래스가 "상속 된"AttributeUsage 플래그를 상속합니까?
- 베이스 속성 클래스
BaseAttribute
가AttributeUsageAttribute
그것 (Inherited = False
) 상속 아니라고 지정이 있습니다. - 파생 된 특성 클래스
DerivedAttribute
은 해당 기본 특성 클래스에서 상속됩니다. - 기본 도메인 클래스
Base
에는 파생 된 특성이 적용되어 있습니다. - 도메인 클래스
Derived
에서 기본 도메인 클래스를 상속 받으면 상속 된 특성 (inherit: true
)을 포함한 사용자 지정 특성을 묻습니다.GetCustomAttributes
API는DerivedAttribute
클래스의 인스턴스를 반환,이 시나리오에서는using System; using System.Linq; namespace ConsoleApplication26 { class Program { static void Main() { var attributes = typeof (Derived).GetCustomAttributes (true); foreach (var attribute in attributes) { Console.WriteLine ( "{0}: Inherited = {1}", attribute.GetType().Name, attribute.GetType().GetCustomAttributes (typeof (AttributeUsageAttribute), true).Cast<AttributeUsageAttribute>().Single().Inherited); } } } [AttributeUsage (AttributeTargets.All, Inherited = false)] public class BaseAttribute : Attribute { } public class DerivedAttribute : BaseAttribute { } [Derived] public class Base { } public class Derived : Base { } }
: 여기
는 해당 코드입니다. http://msdn.microsoft.com/en-us/library/system.attributeusageattribute.aspx은 AttributeUsageAttribute
자체가 상속 가능하다고 말하기 때문에 인스턴스를 반환하지 않을 것으로 예상했을 것입니다.
이제 버그입니까, 아니면 어딘가에 문서화되어 있어야합니까?
주 (2013년 2월 20일는) : 실험은 BaseAttribute
클래스의 AttributeTargets
부분은 실제로 DerivedAttribute
클래스에서 상속되는 것으로 나타났다. 예를 들어 BaseAttribute
에서 허용 된 타겟을 AttributeTargets.Method
으로 변경하면 C# 컴파일러에서 DerivedAttribute
을 클래스에 적용 할 수 없습니다. 따라서 부분이 DerivedAttribute
에 의해 상속되지 않는다는 의미가 아니므로 GetCustomAttributes
구현의 버그를 생각해 볼 수 있습니다.
잘 모르겠습니다. 속성을 보지 않으려면 * false *를 GetCustomAttributes() 메서드에 전달해야합니다. –
예, 나는 단지 '거짓'을 전달할 수 있음을 알고 있습니다. 그러나 'Derived'클래스가 특성을 상속 받아서는 안되지만 'true'를 전달할 때 왜 호의를 얻었는지 이해하려고합니다. 내가보고있는 것을 설명하는 문서 나 명세의 일부를 지적하고 싶다. –
AttributeUsageAttribute Inherited 플래그는 AttributeUsageAttribute가 [AttributeUsage (AttributeTargets.Class, Inherited = true)]로 꾸며져 있기 때문에 상속되지 않는 것으로 보입니다. –