我有以下示例代码:
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
{
}
如果这不可能,那么我将不得不考虑使用多个属性,我现在正在成功地做,但我想要一个更清洁,更简洁的方法。
答案 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 {...}