私が読んでいる本によると、のAllowMultiple
公開プロパティは次のようにAttributeUsage
指定されています。
...ターゲットにアトリビュートの複数のインスタンスを適用できるかどうか。
なぜ私はこれを使いたい/使いたくないのでしょうか?
私が読んでいる本によると、のAllowMultiple
公開プロパティは次のようにAttributeUsage
指定されています。
...ターゲットにアトリビュートの複数のインスタンスを適用できるかどうか。
なぜ私はこれを使いたい/使いたくないのでしょうか?
属性はメタデータです。通常、メンバーまたは型を属性で装飾して、それに関する情報を追跡する必要があります。
たとえば、DescriptionAttribute は、プロパティの説明にラベルを付けるために PropertyGrid によって使用されます。
[Description("This is my property")]
public int MyProperty { get; set; }
ほとんどの場合、複数の説明を使用しても意味がありません。
ただし、特定の属性を複数回使用することが理にかなっている可能性があります。その場合、属性を設定して、同じ属性にタグ付けされたそれ自体の複数のインスタンスを許可する必要があります。
(私ならそうするつもりはありませんが...) クラスへの主要な変更を追跡するためにカスタム属性を作成したとします。主要な変更ごとにこれをリストしたい場合があります。
[Changes(Version=1.1, Change="Added Foo Feature")]
[Changes(Version=2.0, Change="Added Bar Feature")]
public class MyClass
{
// ...
この例は少し不自然かもしれませんが、うまくいけば要点が理解できるでしょう。
[Convertable(typeof(Int32)), Convertable(typeof(Double))]
public class Test
{
}
これは、属性が何であるかによって異なります。
たとえば、クラスが何かに依存しているとマークする属性を作成し、複数の依存関係を許可することができます。
具体的な例についてはSuppressMessage
、コード分析の警告を抑制する を参照してください。メンバーは、抑制したい複数の警告を持つことができます。
別の例は次のとおりですWebResource
。アセンブリには複数のリソースを含めることができます。
ここでは不自然な例はありません。実際の製品コードで使用しました。(code = value)のようなデータのペアを含むファイルを解析するためのコードを作成しました。関数にカスタム属性を設定して、特定のコードに対して呼び出す必要があることを示します。
[CanParseCode("G1")]
[CanParseCode("G2")]
private void ParseGXCodes(string code, string value)
{
...
}
この特定の形式はやや古く、ドメイン固有であり、何百もの異なるコードがあります。私の目標は、必要なコードのみを抽出し、残りを無視できるファイルプロセッサを簡単に作成できるようにするフレームワークを作成することでした。同じ属性を複数回許可すると、各コードを処理する関数で属性を宣言するだけで、コードの意図を簡単に表現できます。