C# 在不知道相关表达式的类型的情况下,是否可以创建类似MethodCallExpression的东西?
我正在玩Roslyn CTP nuget包,我想我会熟悉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)
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)
Compilation.Create(...).GetSemanticModel(ast).GetTypeInfo(expression);