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

8
我正在尝试从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的格式如下:

{0}

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

我正在尝试传入Expression[]。

现在,我可以通过创建一个数组,将其填充为表达式的结果,但我真正想要的结果是这样的:

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

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

2个回答

11

"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()方法

话虽如此,如果您只想要两个参数(或一个或三个),则有string.Format()的重载版本可直接从表达式中使用。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接