2013-02-19 34 views
6

次のシナリオを検討してください:カスタム属性クラスは継承されたAttributeUsageフラグを継承しますか?

  • 基本属性クラスBaseAttributeは、それが(Inherited = False)継承可能ではないことを指定AttributeUsageAttributeを持っています。
  • 派生した属性クラス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

わかりません。属性を見たくない場合は、GetCustomAttributes()メソッドに* false *を渡す必要があります。 –

+0

はい、私はちょうど 'false'を渡すことができることを知っています。しかし、 '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

ええと...まあ、その後...いい質問です! –

関連する問題