Tim*_*dge 6 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);
Run Code Online (Sandbox Code Playgroud)
但问题是String.Format的签名是:
String.Format(string format, params object[] args)
Run Code Online (Sandbox Code Playgroud)
而我正试图传递Expression [].
现在我可以解决创建数组的所有麻烦,用表达式的结果填充它,但我真正想要的结果是这样的:
String.Format("({0}) {1}", input.foo, input.bar)
Run Code Online (Sandbox Code Playgroud)
如何通过Linq表达式调用params函数?
什么params实际上做的是只指定ParamArrayAttribute该参数.C#编译器理解这一点,并在幕后创建数组.
表达式不明白这一点,所以如果你想用方法调用方法,你实际上必须自己创建数组params.这可以通过以下事实看出:当使用params-method 将lambda分配给表达式时,表达式包含数组创建:
Expression<Func<string>> expression = () => string.Format("",1,2,3,4);
string expressionString = expression.ToString();
Run Code Online (Sandbox Code Playgroud)
在这里,expressionString将包含此字符串:
() => Format("", new [] {Convert(1), Convert(2), Convert(3), Convert(4)})
Run Code Online (Sandbox Code Playgroud)
要创建创建数组的表达式,请使用该Expression.NewArrayInit()方法.
话虽这么说,如果你只想要两个参数(或一个或三个),你可以直接从表达式中使用一个重载string.Format().