构建方法调用

时间:2015-05-28 18:38:38

标签: powershell neo4jclient

尝试遵循本指南:https://github.com/Readify/Neo4jClient/wiki/cypher-examples#get-all-users-by-label 我需要创建一个lambda表达式,以便将它提供给Return方法。在C#中它看起来像这样:

.Return(n => n.As<Project>())

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

$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(本地定义的类)。现在我可以将它传递给我的方法:

$something.Return($lambda)

然而,我收到此错误

  

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

这表明我没有正确地表达lambda表达式的主体。任何人都可以建议它应该如何改变吗?

1 个答案:

答案 0 :(得分:4)

C#中你有:

.Return(n => n.As<Project>())

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

Expression<Func<ICypherResultItem, Project>>

要在Expression Trees中使用C#创建,我们最终会采取以下措施:

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 我认为就像这样:

$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)

没有办法是一个名副其实的人,我怀疑你能够更好地翻译C#,但希望这会让你走上正轨。 ..

*更新I * 一个小修复,使一切工作。声明一个var来保存MakeGenericMethod期望的类型数组,并将其传递给:

$PrjType = @((new-object Project).GetType())
$body = $exp::Call($param, [Neo4jClient.Cypher.ICypherResultItem].GetMethod("As").MakeGenericMethod($PrjType))