我有以下属性定义:
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
class TestAttribute : Attribute
{
public TestAttribute(List<string> values)
{
}
}
以下对该属性的使用会产生错误:
[Test(new List<string>() { "123", "456" }]
class A
{
}
错误是:
属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式。
请帮忙吗?我正在使用Visual Studio 2012 .NET 4.5。
我不想使用params string[]
代替List<string>
。
答案 0 :(得分:6)
正如错误消息告诉您的那样,您将其作为参数提供给属性构造函数。通常,您必须使用new
创建的任何内容都无效,因为它不是常量,而是在运行时分配。
正如错误消息所示,您可以只使用数组。在你的情况下,使用params数组非常简单:
public TestAttribute(params string[] values)
{ }
然后你可以像这样使用它:
[Test("123", "456")]
class A
{ }
但请注意,您已将TestAttribute
定义为仅对方法有效,而不是对类声明有效。所以这仍然会失败。
我不想使用
params string[]
代替List<string>
。
嗯,你没有太多的选择,你可以使用普通数组,所以你必须写new string[] {"123", "456"}
代替 - 这不会给你带来任何好处。
如果你真的想要一个列表,虽然确实不需要它,你可以在构造函数中创建它:
public TestAttribute(params string[] values)
{
List<string> valuesList = new List<string>(values);
}
我想传递特定类型的对象而不是静态的对象。
您无法将任何动态传递给属性。在处理声明时很早就会对它们进行评估,所以那时代码的其余部分不太可能被执行。
答案 1 :(得分:5)
就像消息sais一样,它在c#中根本不受支持。 (原因是属性是元数据,应该可以在不执行代码的情况下反映/读取元数据 - 例如初始化列表。)
但您可以使用params关键字:
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
class TestAttribute : Attribute
{
public TestAttribute(params string[] values)
{
}
}
[Test("123", "456")]
class A
{
}