gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:28:48 28 4
gpt4 key购买 nike

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

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

public override Expression VisitInvocationExpression(InvocationExpressionSyntax node) {
???
}

我一无所有。 node有一个 Expression可以通过访问它来解决的属性,只要它不是方法调用:

return Expression.Invoke(
Visit(node.Expression),
node.ArgumentList.Arguments.Select(a => Visit(a.Expression))
)

这似乎只要 Expression 就有效不是方法调用。如果它是一个方法调用(静态、实例或扩展),第一次访问结束调用 VisitMemberAccessExpression然后我失败了(由于这些不是成员的性质)。

有解决办法吗?

最佳答案

Expression.Call 是要走的路。但是您仍然需要使用语义数据来获取关联的反射数据,例如 Types 和 MethodInfo。

解决方法是:

  1. 通过调用 Compilation.Create(...) 获取编译对象,换句话说:使用 Roslyn API 编译您的程序
  2. 通过调用 GetSemanticModel(ast)
  3. 从中获取 SemanticModel
  4. 调用 GetTypeInfo(expression) 获取 TypeInfo

所以……总结一下

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

关于c# - 是否可以在不知道相关表达式类型的情况下创建类似 MethodCallExpression 的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20532391/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com