我可以使用数组或其他可变数量的参数初始化C#属性吗?

是否有可能创build一个可以使用可变数量的参数进行初始化的属性?

例如:

[MyCustomAttribute(new int[3,4,5])] // this doesn't work public MyClass ... 

属性将需要一个数组。 虽然如果你控制这个属性,你也可以使用params (对消费者来说更好,IMO):

 class MyCustomAttribute : Attribute { public int[] Values { get; set; } public MyCustomAttribute(params int[] values) { this.Values = values; } } [MyCustomAttribute(3, 4, 5)] class MyClass { } 

你的数组创build的语法恰好是closures的:

 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 

对于常规的reflection使用,可能最好有多个属性,即

 [Foo("abc"), Foo("def")] 

然而,这不适用于TypeDescriptor / PropertyDescriptor ,其中只支持任何属性的单个实例(无论是第一个还是最后一个获胜,我都不记得是哪个)。

尝试像这样声明构造函数:

 public class MyCustomAttribute : Attribute { public MyCustomAttribute(params int[] t) { } } 

那么你可以像这样使用它:

[MyCustomAttribute(3, 4, 5)]

这应该没问题。 从规范中,第17.2节:

如果以下所有语句都为真,则expression式E是属性参数expression式

  • E的types是属性参数types(第17.1.3节)。
  • 在编译时,E的值可以parsing为以下之一:
    • 恒定的价值。
    • 一个System.Type对象。
    • 属性参数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 { } 

是的,但是你需要初始化你传入的数组。下面是我们unit testing中的一个行testing的例子,它testing可变数量的命令行选项;

 [Row( new[] { "-l", "/port:13102", "-lfsw" } )] public void MyTest( string[] args ) { //... } 

你可以做到这一点。 另一个例子可能是:

 class MyAttribute: Attribute { public MyAttribute(params object[] args) { } } [MyAttribute("hello", 2, 3.14f)] class Program { static void Main(string[] args) { } } 

为了回绝Marc Gravell的回答,是的,你可以定义一个带有数组参数的属性,但是应用一个带有数组参数的属性不符合CLS。 然而,仅仅定义一个具有数组属性的属性完全符合CLS。

是什么让我意识到这是Json.NET,一个符合CLS的库,有一个属性类JsonPropertyAttribute与属性名为ItemConverterParameters是一个对象数组。