使用Expression []调用(params object [])

时间:2011-05-24 22:01:34

标签: c# linq-expressions

我正在尝试在Linq.Expression树中调用String.Format。这是一个简单的例子:

    var format = Expression.Constant("({0}) {1}");
    var company = Expression.Property(input, membernames.First());
    var project = Expression.Property(input, membernames.Last());
    var args = new Expression[] {format, company, project};
    var invoke = Expression.Call(method,args);

但问题是String.Format的签名为:

String.Format(string format, params object[] args)

我试图传递Expression []。

现在我可以解决创建数组的所有麻烦,用表达式的结果填充它,但我真正想要的结果是这样的:

String.Format("({0}) {1}", input.foo, input.bar)

如何通过Linq表达式调用params函数?

2 个答案:

答案 0 :(得分:9)

params实际上只是为该参数指定ParamArrayAttribute。 C#编译器理解这一点,并在幕后创建数组。

表达式不明白这一点,所以如果你想用params调用一个方法,你实际上必须自己创建数组。这可以通过以下事实看出:当您使用params - 方法将lambda分配给表达式时,表达式包含数组创建:

Expression<Func<string>> expression = () => string.Format("",1,2,3,4);
string expressionString = expression.ToString();

此处,expressionString将包含此字符串:

() => Format("", new [] {Convert(1), Convert(2), Convert(3), Convert(4)})

要创建创建数组的表达式,请使用Expression.NewArrayInit() method

话虽如此,如果您只想要两个参数(或一个或三个),可以直接从表达式中使用an overload of string.Format()

答案 1 :(得分:0)

params只是语法糖。最终参数只是一个数组。因此,参数类型应为object[],并且描述此类数组的表达式应作为第二个参数传递。换句话说,您应该只有两个参数,而不是三个。第二个参数应该是一个包含当前第2和第3个参数的双元素数组。