2015-05-28 31 views
1

试图遵循本指南: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) 

使得参数传递给拉姆达表达式被键入以接收Neo4j表达式将传递的内容,并且该方法的主体将其转换为Project(本地定义的类)。现在我可以将它传递给我的方法:但是

$something.Return($lambda) 

,我得到这个错误

异常调用“返回”和“1”的说法(S):“表达式必须 被构建为(例如:n => new MyResultType {Foo = n.Bar}),匿名类型初始值设定项(对于 示例:n => new {Foo = n.Bar}),方法调用例如:n => n.Count())或成员访问器(例如:n => n.As()。Bar)。 无法提供代码块(例如:n => {var a = n + 1; return a; })或使用带参数的构造函数(例如:n => new Foo(n))。如果你在F#中,元组也被支持。参数名称: 表达式“在行:1 char:1 + $ neo.Cypher.Match(”n“)。Return($ return) + ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:NotSpecified:(:) [],MethodInvocationException + FullyQualifiedErrorId:ArgumentException的

这使得它清楚我没有“T正确制定lambda表达式的身体任何人都可以提出应该如何,而不是

+0

您是否尝试过建议的第二种方法(用'C#'帮助下)?即使只是为了测试它可以工作,然后再按照你尝试的方式创建'Expressions'。我想你会想要这样的东西:'Expression > Proj =(n)=> n.As ();' –

+0

是的,第二种方式PetSerAl建议的作品,但这会有点清洁工,我只是想弄清楚 – ekkis

回答

3

C#您有:?

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

如果我们说出来,并期待在类型,n => n.As<Project>()是:

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#更好的翻译,但希望这将让你在正确的轨道......

*更新I * 小修复程序使这一切工作。声明一个变种持有的该MakeGenericMethod预计类型的数组,并通过在:

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

哈利路亚。那非常接近。我做了一个小修复,现在我收回数据。是啊! – ekkis