回答:
属性は配列を取ります。params
ただし、属性を制御する場合は、代わりに使用することもできます(これは、消費者にとってより良いIMO)。
class MyCustomAttribute : Attribute {
public int[] Values { get; set; }
public MyCustomAttribute(params int[] values) {
this.Values = values;
}
}
[MyCustomAttribute(3, 4, 5)]
class MyClass { }
配列を作成するための構文はたまたまずれています。
class MyCustomAttribute : Attribute {
public int[] Values { get; set; }
public MyCustomAttribute(int[] values) {
this.Values = values;
}
}
[MyCustomAttribute(new int[] { 3, 4, 5 })]
class MyClass { }
できますが、CLSに準拠していません。
[assembly: CLSCompliant(true)]
class Foo : Attribute
{
public Foo(string[] vals) { }
}
[Foo(new string[] {"abc","def"})]
static void Bar() {}
ショー:
Warning 1 Arrays as attribute arguments is not CLS-compliant
通常のリフレクションを使用する場合は、複数の属性を持つことをお勧めします。
[Foo("abc"), Foo("def")]
ただし、これはTypeDescriptor
/ PropertyDescriptor
で機能しません。属性の単一のインスタンスのみがサポートされます(最初または最後のどちらが勝ったか、私はどちらを思い出すことができません)。
それは大丈夫です。仕様のセクション17.2から:
式Eは、以下のステートメントがすべて当てはまる場合、attribute-argument-expressionです。
次に例を示します。
using System;
[AttributeUsage(AttributeTargets.All, AllowMultiple = false, Inherited = true)]
public class SampleAttribute : Attribute
{
public SampleAttribute(int[] foo)
{
}
}
[Sample(new int[]{1, 3, 5})]
class Test
{
}