首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >构造方法调用

构造方法调用
EN

Stack Overflow用户
提问于 2015-05-28 18:38:37
回答 1查看 232关注 0票数 2

为了遵循本指南:https://github.com/Readify/Neo4jClient/wiki/cypher-examples#get-all-users-by-label,我需要创建一个lambda表达式,以便将其提供给Return方法。在C#中,如下所示:

代码语言:javascript
复制
.Return(n => n.As<Project>())

在Powershell中,我已经这样做了(按照@PetSerAl的建议:Return overload fails):

代码语言:javascript
复制
$exp = [System.Linq.Expressions.Expression]
$param = $exp::Parameter([Neo4jClient.Cyper.ICypherResultItem], "n")
$body = $exp::TypeAs($p, (new-object Project).GetType())
$lambda = $exp::Lambda([Func[Project]], $body, $p)

这样,就可以键入传递给lambda表达式的参数,以接收Neo4j表达式将传递的内容,并且方法的主体将其转换为Project (本地定义的类)。现在我可以把它传递给我的方法:

代码语言:javascript
复制
$something.Return($lambda)

但是,我得到了这个错误

带有"1“参数的异常调用:”表达式必须构造为对象初始化器(例如:n =>新MyResultType { Foo = n.Bar })、匿名类型初始化器(例如:n => new{ Foo = n.Bar })、方法调用(例如:n => n.Count())或成员访问器(例如:n => n.As().Bar)。您不能提供代码块(例如:n => { var a=n+ 1;返回a;})或使用带参数的构造函数(例如:n => new (N))。如果您使用的是F#,则还支持元组。参数名称:表达式行:1字符:1+ $neo.Cypher.Match("n").Return($return) +~+ CategoryInfo : NotSpecified:(:) [],MethodInvocationException + FullyQualifiedErrorId : ArgumentException

这表明,我没有正确地构造lambda表达式的主体。有人能建议应该怎么做吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-02 14:08:33

C#中,您有:

代码语言:javascript
复制
.Return(n => n.As<Project>())

如果我们把它取出来,看看类型,n => n.As<Project>()是:

代码语言:javascript
复制
Expression<Func<ICypherResultItem, Project>>

要在Expression Trees中使用C#来创建它,我们最终会执行如下操作:

代码语言:javascript
复制
ParameterExpression parameter = Expression.Parameter(typeof (ICypherResultItem), "n");
MethodCallExpression right = Expression.Call(parameter, typeof (ICypherResultItem).GetMethod("As").MakeGenericMethod(typeof(Project)));
Expression<Func<ICypherResultItem, Project>> expression = Expression.Lambda<Func<ICypherResultItem, Project>>(right, parameter);

因此,将其转换为PowerShell,我认为它是这样的:

代码语言:javascript
复制
$exp = [System.Linq.Expressions.Expression]
$param = $exp::Parameter([Neo4jClient.Cypher.ICypherResultItem], "n")
$body = $exp::Call($param, [Neo4jClient.Cypher.ICypherResultItem].GetMethod("As").MakeGenericMethod[Project])
$lambda = $exp::Lambda([Func[ICypherResultItem, Project]], $body, $param)

我在不可能是一个powershell的人,我怀疑你能更好地翻译C#,但希望这能让你走上正确的轨道.

* Update *是一个小的修复程序,可以使其全部正常工作。声明一个var以保存MakeGenericMethod所期望的类型数组,并将其传入:

代码语言:javascript
复制
$PrjType = @((new-object Project).GetType())
$body = $exp::Call($param, [Neo4jClient.Cypher.ICypherResultItem].GetMethod("As").MakeGenericMethod($PrjType))
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30514603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档