次のシナリオを検討してください:カスタム属性クラスは継承された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.aspxはAttributeUsageAttribute
自体が継承可能であると言っているので、そのインスタンスを返さないと予想していました。
これはバグですか、どこかに期待/書類がありますか?
注(2013年2月20日):実験BaseAttribute
クラスのAttributeTargets
一部が実際にDerivedAttribute
クラスによって継承されることを示しています。たとえば、BaseAttribute
の許可されたターゲットをAttributeTargets.Method
に変更すると、C#コンパイラはDerivedAttribute
をクラスに適用することを許可しません。したがって、の部分がDerivedAttribute
に継承されていないということは意味がありません。したがって、GetCustomAttributes
の実装でバグを考える傾向があります。
わかりません。属性を見たくない場合は、GetCustomAttributes()メソッドに* false *を渡す必要があります。 –
はい、私はちょうど 'false'を渡すことができることを知っています。しかし、 'Derived'クラスが属性を継承してはならないにもかかわらず、私が' true'を渡すときに私がアトリゲートを得ている理由を理解しようとしています。私は何を見ているのかを説明しているドキュメントや仕様書を指摘したいと思います。 –
AttributeUsageAttribute Inheritedフラグは、AttributeUsageAttributeが[AttributeUsage(AttributeTargets.Class、Inherited = true)]で装飾されていると予想されますが、継承されていないようです。 –