5

以下を考えると、AllowMultiple=false に設定されている場合、基本属性から派生した複数の属性をコンパイラが許可するとは思わないでしょう。実際、問題なくコンパイルされます-ここで何が欠けていますか?

using System;

[AttributeUsage(AttributeTargets.Property,AllowMultiple=false,Inherited=true)]
abstract class BaseAttribute : Attribute { }

sealed class DerivedAttributeA : BaseAttribute { }

sealed class DerivedAttributeB : BaseAttribute { }

    class Sample1
    {
        [DerivedAttributeA()]
        [DerivedAttributeB()]
        public string PropertyA{ get; set; } // allowed, concrete classes differ

        [DerivedAttributeA()]
        [DerivedAttributeA()]
        public string PropertyB { get; set; } // not allowed, concrete classes the same, honours AllowMultiple=false on BaseAttribute
    }
4

1 に答える 1

6

問題は、チェックが同じ実際のAllowMultipleタイプ(つまり、インスタンス化された具象タイプ)の属性のみを比較することであり、この理由から、おそらく属性とともに使用するのが最適です。sealed

たとえば、次のことを(違法な複製として)強制し、これを次から継承しBaseAttributeます。

[DerivedAttributeB()]
[DerivedAttributeB()]
public string Name { get; set; }

要するに、ここでやりたいことができるとは思いません...(プロパティごとのサブクラスを含むインスタンスを1つだけ強制しBaseAttributeます)。

この問題の同様の例は次のとおりです。

[Description("abc")]
[I18NDescriptionAttribute("abc")]
public string Name { get; set; }

class I18NDescriptionAttribute : DescriptionAttribute {
    public I18NDescriptionAttribute(string resxKey) : base(resxKey) { } 
}

上記の目的は[Description]、実行時にfrom resxを提供することです(ComponentModelなどで完全にサポートされています)が、。を追加することも止められません[Description]

于 2009-10-12T11:24:41.293 に答える