2013-02-19 4 views
6

는 다음과 같은 시나리오를 생각해보십시오 :사용자 지정 특성 클래스가 "상속 된"AttributeUsage 플래그를 상속합니까?

  • 베이스 속성 클래스 BaseAttributeAttributeUsageAttribute 그것 (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.aspxAttributeUsageAttribute 자체가 상속 가능하다고 말하기 때문에 인스턴스를 반환하지 않을 것으로 예상했을 것입니다.

이제 버그입니까, 아니면 어딘가에 문서화되어 있어야합니까?

주 (2013년 2월 20일는) : 실험은 BaseAttribute 클래스의 AttributeTargets 부분은 실제로 DerivedAttribute 클래스에서 상속되는 것으로 나타났다. 예를 들어 BaseAttribute에서 허용 된 타겟을 AttributeTargets.Method으로 변경하면 C# 컴파일러에서 DerivedAttribute을 클래스에 적용 할 수 없습니다. 따라서 부분이 DerivedAttribute에 의해 상속되지 않는다는 의미가 아니므로 GetCustomAttributes 구현의 버그를 생각해 볼 수 있습니다.

+0

잘 모르겠습니다. 속성을 보지 않으려면 * false *를 GetCustomAttributes() 메서드에 전달해야합니다. –

+0

예, 나는 단지 '거짓'을 전달할 수 있음을 알고 있습니다. 그러나 'Derived'클래스가 특성을 상속 받아서는 안되지만 'true'를 전달할 때 왜 호의를 얻었는지 이해하려고합니다. 내가보고있는 것을 설명하는 문서 나 명세의 일부를 지적하고 싶다. –

+1

AttributeUsageAttribute Inherited 플래그는 AttributeUsageAttribute가 [AttributeUsage (AttributeTargets.Class, Inherited = true)]로 꾸며져 있기 때문에 상속되지 않는 것으로 보입니다. –

답변

0

.NET 4.0의 메타 데이터에 따르면 AttributeUsageAttribute 클래스는 [AttributeUsage(AttributeTargets.Class, Inherited = true)]으로 표시됩니다. 따라서 속성 클래스 (예 : BaseAttribute)에 AttributeUsageAttribute이 적용되어 있으면 (Attribute 클래스는해야하지만, 아래에 표시되지 않으면 아무 것도 해체하지 않음) BaseAttribute에서 파생 된 클래스는 그것에 적용된 AttributeUsage 속성을 상속합니다. 반사 API는 BaseAttribute의 속성에 의존하므로 DerivedAttribute은, 자신의 AttributeUsageAttribute이 적용되어 있지 않기 때문에

귀하의 Derived 클래스는 자료에서 DerivedAttribute을 상속합니다. 이제 BaseAttribute 클래스에서 AttributeUsageAttribute을 꺼내십시오. System.Attribute 클래스가 [AttributeUsage(AttributeTargets.All, Inherited = true, AllowMultiple = false)]으로 표시되어 있기 때문에 동일한 결과를 얻습니다. 따라서 다른 특성 클래스를 지정하지 않으면 모든 특성 클래스가이 특성을 상속합니다.

와우, 그것들은 복잡한 단락입니다. 속성에 대한 속성으로 인해 과도한 읽기가 발생합니다. P

+1

하지만 내 'BaseAttribute'는 상속받을 수 없도록 선언되었습니다. 따라서 Reflection API가'BaseAttribute'의 선언 된 속성 사용에 의존하는 경우 왜 'DerivedAttribute'가 상속받을 수 있습니까? –

+0

흠 ... 음, 그럼 ... 좋은 질문이야! –

관련 문제