用Expression []调用params object []

问题描述

|| 我正在尝试从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 Expressions调用params函数?     

解决方法

params
的实际作用只是为该参数指定
ParamArrayAttribute
。 C#编译器了解这一点,并在后台创建了数组。 表达式不理解这一点,因此,如果要使用
params
调用方法,则实际上必须自己创建数组。这也可以从以下事实看出:当您使用
params
方法将lambda分配给表达式时,该表达式将包含数组创建:
Expression<Func<string>> expression = () => string.Format(\"\",1,2,3,4);
string expressionString = expression.ToString();
在这里,“ 8”将包含以下字符串:
() => Format(\"\",new [] {Convert(1),Convert(2),Convert(3),Convert(4)})
要创建创建数组的表达式,请使用
Expression.NewArrayInit()
方法。 就是说,如果只需要两个参数(或一个或三个),则可以直接在表达式中使用
string.Format()
重载。     ,
params
只是语法糖。最终,该参数只是一个数组。因此,参数类型应为
object[]
,并且描述该数组的表达式是您应作为第二个参数传递的内容。换句话说,您应该只有两个参数,而不是三个。第二个参数应该是一个包含两个元素的数组,其中包含当前的第二个和第三个参数。