1

我有以下属性定义:

[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>.

4

2 回答 2

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);
}

我想传递特定类型的对象而不是静态的。

你永远不能将任何动态的东西传递给属性。当声明被处理时,它们很早就被评估了,所以那时你的其余代码不太可能被执行。

于 2013-10-23T19:05:16.810 回答
5

就像消息一样,c# 根本不支持它。(原因是属性是元数据,应该可以在不执行代码的情况下反映/读取元数据 - 例如初始化列表)。

但是您可以使用 params 关键字:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
class TestAttribute : Attribute
{
    public TestAttribute(params string[] values)
    {
    }
}

[Test("123", "456")]
class A
{
}
于 2013-10-23T19:04:37.587 回答