如何获取 Roslyn 中 NamedTypeSymbol 的所有适用方法,包括扩展方法?

Posted

技术标签:

【中文标题】如何获取 Roslyn 中 NamedTypeSymbol 的所有适用方法,包括扩展方法?【英文标题】:How to get all applicable methods, including extension methods, for a NamedTypeSymbol in Roslyn? 【发布时间】:2016-06-03 14:12:15 【问题描述】:

我正在尝试使用附加语法扩展 Roslyn 编译器,与 LINQ 不同,它必须事先知道 SelectZip 等是否可以应用于该类型。我在活页夹中执行此操作,因为我将嵌套语法节点简化为单个绑定表达式。 NamedTypeSymbol 上的 GetMembers 仅返回该类型的实际成员。如何获取为该类型定义且可在代码中的此位置访问的扩展方法列表?

【问题讨论】:

你看过这个代码示例吗? joshvarty.wordpress.com/roslynfaq/csharp/#faq5 @WouterdeKort 谢谢,但这有点不同。这个 sn-p 首先编译源代码,而我正在扩展 Roslyn 编译器本身。谢谢,反正我看看SemanticModel是哪一步产生的。 请注意,如果您使用语法生成类型推断表达式,并将这些名称作为匿名类型的委托成员或常规成员,这样的扩展可能会导致绑定阶段的循环依赖,并在表达式中使用该推断类型。 【参考方案1】:

我不确定这是否适用于Binder 级别,但如果您可以获得Compilation 对象,那么您可以查询其GlobalNamespace 属性,即“根包含在源代码或引用元数据中定义的所有命名空间和类型的命名空间,并合并到一个命名空间层次结构中。”从中您可以获得(***)类型声明,然后您可以简单地查找与您正在处理的类型匹配的任何扩展方法。

【讨论】:

以上是关于如何获取 Roslyn 中 NamedTypeSymbol 的所有适用方法,包括扩展方法?的主要内容,如果未能解决你的问题,请参考以下文章

Roslyn 如何获得一个类的引用

Roslyn 的 SyntaxReceiver - 获取类实现接口

升级到 Roslyn 分析仪 6.0 版后获取 CA2007

Roslyn:如何修复 RS2008 警告?

使用 Roslyn 编译 C# 项目时,如何避免完全重新编译?

如何使用 Roslyn 为类中具有特定返回类型的所有属性添加 JsonIgnore 属性?