我正在尝试在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函数?
答案 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个参数的双元素数组。