6

属性コード

[AttributeUsage(AttributeTargets.Property, Inherited = true)]
class IgnoreAttribute : Attribute
{
}

基本クラス

abstract class ManagementUnit
{
    [Ignore]
    public abstract byte UnitType { get; }
}

メインクラス

class Region : ManagementUnit
{
    public override byte UnitType
    {
        get { return 0; }
    }

    private static void Main()
    {
        Type t = typeof(Region);
        foreach (PropertyInfo p in t.GetProperties())
        {
            if (p.GetCustomAttributes(typeof(IgnoreAttribute), true).Length != 0)
                Console.WriteLine("have attr");
            else
                Console.WriteLine("don't have attr");
        }
    }
}

出力: don't have attr

なぜこれが起こっているのか説明してください。結局のところ、それは継承されなければなりません。

4

2 に答える 2

5

継承フラグは、属性を継承できるかどうかを示します。この値のデフォルトは false です。ただし、継承フラグが true に設定されている場合、その意味は AllowMultiple フラグの値によって異なります。継承されたフラグが true に設定され、AllowMultiple フラグが false に設定されている場合、属性は継承された属性をオーバーライドします。ただし、継承フラグが true に設定され、AllowMultiple フラグも true に設定されている場合、属性はメンバーに蓄積されます。

http://aclacl.brinkster.net/InsideC/32ch09f.htmから 「継承属性規則の指定」の章を確認してください

編集:抽象プロパティのカスタム属性の継承を確認します 最初の答え:

親宣言を見ないのは GetCustomAttributes() メソッドです。指定されたメンバーに適用された属性のみを調べます。

于 2012-04-27T09:34:28.320 に答える
1

https://msdn.microsoft.com/en-us/library/dwc6ew1d.aspxに記載されているように、PropertyInfo.GetCustomAttributesの継承フラグはプロパティとイベントの両方で無視されます。ただし、Attribute.GetCustomAttributes オーバーロードの 1 つを使用して、プロパティ (またはイベント) の継承を有効にすることができます。

この問題については、http: //blog.seancarpenter.net/2012/12/15/getcustomattributes-and-overridden-properties/で詳しく説明しています。

于 2015-08-24T09:34:35.487 に答える