属性中的结构参数

时间:2014-06-27 08:21:28

标签: c# custom-attributes

我有以下示例代码:

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()结构中捕获一对参数(string,bool),但我不确定是否可以这样做。我尝试了以下内容,但是我收到了编译错误“属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式”。

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

}

如果这不可能,那么我将不得不考虑使用多个属性,我现在正在成功地做,但我想要一个更清洁,更简洁的方法。

2 个答案:

答案 0 :(得分: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方法,然后您的代码看起来会更好。

答案 1 :(得分:1)

确实,这是不可能的。使用string并解析它;或使用多个属性声明,即

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