Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在不知道相关表达式的类型的情况下,是否可以创建类似MethodCallExpression的东西?_C#_Linq_Expression Trees_Roslyn - Fatal编程技术网

C# 在不知道相关表达式的类型的情况下,是否可以创建类似MethodCallExpression的东西?

C# 在不知道相关表达式的类型的情况下,是否可以创建类似MethodCallExpression的东西?,c#,linq,expression-trees,roslyn,C#,Linq,Expression Trees,Roslyn,我正在玩Roslyn CTP nuget包,我想我会熟悉SyntaxVisitor类,所以我创建了一个Roslyn.Compilers.CSharp.SyntaxNode到System.Linq.Expression转换器(这似乎适用于任何不涉及AST未知的语义知识或访问调用之外提供的语义知识的代码) 无论如何,我有以下代码: public override Expression VisitInvocationExpression(InvocationExpressionSyntax node)

我正在玩Roslyn CTP nuget包,我想我会熟悉
SyntaxVisitor
类,所以我创建了一个
Roslyn.Compilers.CSharp.SyntaxNode
System.Linq.Expression
转换器(这似乎适用于任何不涉及AST未知的语义知识或访问调用之外提供的语义知识的代码)

无论如何,我有以下代码:

public override Expression VisitInvocationExpression(InvocationExpressionSyntax node) {
    ???
}
我什么都没有。
节点
有一个
表达式
属性,只要不是方法调用,就可以通过访问该属性来解决:

return Expression.Invoke(
    Visit(node.Expression), 
    node.ArgumentList.Arguments.Select(a => Visit(a.Expression))
)
只要
Expression
不是方法调用,这似乎就可以工作。如果是方法调用(静态、实例或扩展),则第一次访问将调用
VisitMemberAccessExpression
,然后我失败了(由于这些不是成员的性质)


有办法解决这个问题吗?

Expression.Call
是一种方法。 但仍然需要使用语义数据来获取相关的反射数据,如类型和MethodInfo

解决方法是:

  • 通过调用
    compilation.Create(…)
    获取编译对象换句话说:使用Roslyn API编译您的程序
  • 通过调用
    GetSemanticModel(ast)
  • 调用GetTypeInfo(表达式)获取TypeInfo
  • 所以…总结一下

    Compilation.Create(...).GetSemanticModel(ast).GetTypeInfo(expression);