次のシナリオを検討してください。
- 基本属性クラスには、継承可能ではない
BaseAttribute
という指定があります ( )。AttributeUsageAttribute
Inherited = False
- 派生属性クラス
DerivedAttribute
は、その基本属性クラスから継承します。 - ベース ドメイン クラス
Base
には、派生属性が適用されています。 - ベース ドメインクラス
Derived
から継承するドメイン クラスは、継承された属性 ( ) を含むカスタム属性を要求されますinherit: true
。
対応するコードは次のとおりです。
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
{
}
}
このシナリオでは、GetCustomAttributes
API はDerivedAttribute
クラスのインスタンスを返します。http://msdn.microsoft.com/en-us/library/system.attributeusageattribute.aspxAttributeUsageAttribute
はそれ自体が継承可能であると述べているため、そのインスタンスが返されないと予想していました。
さて、これはバグですか、それとも予想される/どこかに文書化されていますか?
注 (2013-02-20):実験AttributeTargets
では、クラスの一部BaseAttribute
が実際にクラスによって継承されることが示されていDerivedAttribute
ます。たとえば、許可されたターゲットを に変更するBaseAttribute
と、C# コンパイラはクラスAttributeTargets.Method
への適用を許可しません。DerivedAttribute
したがって、そのInherited = false
部分が に継承されないということは意味がなくDerivedAttribute
、 の実装にバグがあると考えがちですGetCustomAttributes
。