【问题标题】:Constructing a method call构造方法调用
【发布时间】:2015-06-04 06:55:40
【问题描述】:

尝试遵循本指南: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”个参数调用“返回”的异常:“表达式必须 被构造为对象初始化器(例如:n => new MyResultType { Foo = n.Bar }),一个匿名类型初始化器(对于 例如:n => new { Foo = n.Bar }),一个方法调用(例如:n => n.Count()) 或成员访问器(例如:n => n.As().Bar)。你 无法提供代码块(例如:n => { var a = n + 1; 返回一个; })或使用带参数的构造函数(例如:n => new 富(n))。如果您在 F# 中,则还支持元组。参数名称: 表达式”在第 1 行 char:1 + $neo.Cypher.Match("n").Return($return) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [],方法调用异常 + FullyQualifiedErrorId : ArgumentException

这清楚地表明我没有正确地制定 lambda 表达式的主体。谁能建议它应该是怎样的?

【问题讨论】:

  • 您尝试过建议的第二种方法吗(在c# 的帮助下)?即使只是为了测试它是否可以工作,然后再以您尝试的方式创建Expressions。我想你会想要这样的东西:Expression&lt;Func&lt;ICypherResultItem, Project&gt;&gt; Proj=(n) =&gt; n.As&lt;Project&gt;();
  • 是的,PetSerAl 建议的第二种方式可行,但这会更简洁一些,我只是想弄清楚

标签: powershell neo4jclient


【解决方案1】:

C# 你有:

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

如果我们把它拿出来看看类型,n =&gt; n.As&lt;Project&gt;() 是:

Expression<Func<ICypherResultItem, Project>>

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

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)

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

* 更新我 * 一个小修复,使一切正常。声明一个 var 来保存 MakeGenericMethod 期望的类型数组,并将其传入:

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

【讨论】:

  • 哈利路亚。那非常接近。我做了一个小修复,现在我恢复了数据。是啊!!!
猜你喜欢
  • 2013-08-10
  • 2018-08-20
  • 2013-01-02
  • 1970-01-01
  • 2011-06-19
  • 2016-05-31
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
相关资源
最近更新 更多