2014-06-27 68 views
3

我有下面的示例代碼:結構參數

public struct TestData 
{ 
    public readonly string Element; 
    public readonly bool MandatoryInd; 

    public TestData(string element, bool mandatoryInd) 
    { 
     Element = element; 
     MandatoryInd = mandatoryInd; 
    } 
} 

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] 
public class Test : Attribute 
{ 
    public TestData[] Values { get; set; } 

    public Test(params TestData[] values) 
    { 
     this.Values = values; 
    } 
} 

我想要做的是這樣的:

[Test("3477", true, "3286", true, "3286", false)] 
public class TestClass 
{ 

} 

基本上,我想一對參數(字符串,布爾)被捕獲在TestData()結構中,但我不確定是否有可能這樣做。我已經嘗試了以下內容,但出現了編譯錯誤:「屬性參數必須是常量表達式,typeof表達式或屬性參數類型的數組創建表達式」。

[Test(new TestData("3477", true), new TestData("3286", true), new TestData("3286", false))] 
public class TestClass 
{ 

} 

如果這是不可能的,那麼我將不得不考慮使用多個屬性,我此刻的成功做什麼,但我希望有一個更清潔,更更簡潔的方法。

+0

@svick我得到的「‘EDI.Attributes.TestData’是‘類型’,但使用類似「可變」錯誤時,我試圖這一點。 – Intrepid

+0

我的意思是通過將'Test'的構造函數更改爲'public Test(string element,bool mandatoryInd)'來實際使用該屬性多次,這與Marc提出的非常相似,只是語法略有不同。 – svick

+0

@svick我目前正在這樣做,但我想看看是否有任何使用單一屬性來做到這一點。顯然,塞爾曼22已經提出了一種做法,雖然它不是理想的,但它是一個很好的替代方案,可能對我有用。 – Intrepid

回答

2

,如果你改變你的構造方法的簽名,並使用LINQ招這是可能的:

public Test(params object[] values) 
{ 
    this.Values = values 
      .Select((x, idx) => new {x, idx}) 
      .GroupBy(g => g.idx/2) 
      .Select(g => new TestData(g.First().x.ToString(), (bool) g.Last().x)) 
      .ToArray(); 

} 

但實際上它不是類型安全的。

注意:您可能需要使用Batch方法從MoreLINQ那麼您的代碼會更好看。

+0

呃,不,它不是;請說明在這種情況下你將如何使用'[Test(...)]',而不用說「一個屬性參數必須是一個常量表達式,一個屬性參數類型的表達式或數組創建表達式的類型」 –

+0

@MarcGravell抱歉,我沒有得到它。我已經在問題'[Test(「3477」,true,「3286」,true,「3286」,false)]中嘗試了相同的代碼,並且它工作正常。 –

+0

@Selman22啊,對;並不能提供我認爲OP正在尋找的IDE支持,但從技術上說它應該可行,是的;同意。特別是,它不是屬性中的「結構參數」(標題) –

1

的確,這是不可能的。使用string並解析它;或使用多個屬性聲明,即

[Test] 
[TestData("3477", true)] 
[TestData("3286", true)] 
[TestData("3286", false)] 
public class TestClass {...} 
+0

這就是我已經在做的,但我想看看是否可以使用單個屬性來完成它。 – Intrepid

+0

@MikeClarke只有當你使用「從字符串解析」的方法。使用結構化/編譯器檢查的數據:不。這裏有一個基本的限制:「屬性參數必須是一個常量表達式,屬性參數類型的表達式或數組創建表達式」 –

+0

非常好的方法 - 可讀且與SRP一致。 – BartoszKP