动态对象的属性

时间:2013-10-23 19:01:17

标签: c#

我有以下属性定义:

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

2 个答案:

答案 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
{
}