Answers:
属性将采用数组。尽管可以控制属性,但是也可以使用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
{
}