微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 使用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表达式调用params函数

解决方法

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

表达式不理解这一点,所以如果你想用params调用一个方法,你实际上必须自己创建数组.这可以通过以下事实看出:当您使用params-method为表达式分配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().

原文地址:https://www.jb51.cc/csharp/239181.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐