2013-10-23 216 views
1

我有以下属性定义:属性与动态对象

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

以下使用的属性产生一个错误:

[Test(new List<string>() { "123", "456" }] 
class A 
{ 
} 

错误是:

An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type.

不限请帮助?我正在使用Visual Studio 2012 .NET 4.5。我不想使用params string[]而不是List<string>

+0

尝试一个数组,然后呢? – Ryan

+0

对不起,我只是编辑了问题家伙,你现在可以看看它。 – hiddenUser

+0

是的 - 现在它是有道理的! –

回答

6

随着错误消息告诉您,您提供的作为参数传递给属性的构造函数。通常,您必须使用new创建的任何内容都是无效的,因为这不是固定的,而是在运行时分配的。

如错误消息所示,您可以改为使用数组。根据你的情况,这是很简单的一个参数数组做:

public TestAttribute(params string[] values) 
{ } 

然后你可以使用它像这样:

[Test("123", "456")] 
class A 
{ } 

不过请注意,您已经定义TestAttribute是唯一有效的方法,不适用于类声明。所以这仍然会失败。


I don't want to use params string[] instead of List<string> .

好了,你没有多少选择的余地,你可以使用一个普通数组,所以你会写new string[] {"123", "456"}代替,这不给你,虽然任何好处。

如果你真的想要的清单,虽然有真的不应该需要它,你可以在构造函数中创建它:

public TestAttribute(params string[] values) 
{ 
    List<string> valuesList = new List<string>(values); 
} 

I want to pass objects of specific types not something static.

你永远不能传递任何动态属性。在处理声明时,他们会被评估得相当早,所以在那时你的代码的其余部分不太可能被执行。

+0

非常感谢您给予的一切! – hiddenUser

5

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

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

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

[Test("123", "456")] 
class A 
{ 
}