2013-10-23 260 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 
{ 
}