C# Roslyn 2.x代码修复程序,实现了委托给成员的缺失接口,VS 2017

C# Roslyn 2.x代码修复程序,实现了委托给成员的缺失接口,VS 2017,c#,visual-studio-2017,roslyn,roslyn-code-analysis,C#,Visual Studio 2017,Roslyn,Roslyn Code Analysis,背景 我正在寻求创建一个Roslyn代码修复程序,该程序将响应Visual Studio附带的内置分析器发出的诊断警告,该程序将识别未实现或部分实现的接口,从而允许我遍历缺失的成员,并生成自定义代码,将方法调用委托给实现接口的类型的成员字段 (Visual Studio附带的Roslyn分析器和代码修复程序确实提供了此功能,但我需要自定义和扩展代码的生成,这是不可能的,因为Microsoft实现都标记为内部) 请注意:接口几乎总是位于外部第三方程序集中,我无法访问该程序集的源代码 e、 g.从:

背景

我正在寻求创建一个Roslyn代码修复程序,该程序将响应Visual Studio附带的内置分析器发出的诊断警告,该程序将识别未实现或部分实现的接口,从而允许我遍历缺失的成员,并生成自定义代码,将方法调用委托给实现接口的类型的成员字段

(Visual Studio附带的Roslyn分析器和代码修复程序确实提供了此功能,但我需要自定义和扩展代码的生成,这是不可能的,因为Microsoft实现都标记为
内部

请注意:接口几乎总是位于外部第三方程序集中,我无法访问该程序集的源代码

e、 g.从:

public class CustomDocumentDBClient : IDocumentClient
{
}
期望的结果类似于以下内容(在实践中,我将创建多个版本,在基本主体工作后添加额外的代码来包装方法调用):

a) 这确实会返回一个包含语法树中相关节点信息的令牌-但是,我看不到任何“InterfaceTypeSyntax”类型或IsInterface方法来验证它是否实际上是一个接口

b) 我相信我应该能够使用
semanticModel.GetSymbolInfo(interfaceBaseTypeSyntax)
,但是这总是返回null-请记住,接口是在外部程序集中声明的

我是否需要做些什么来通过GetSymbolInfo提供这些信息,或者我是否应该采取另一种方法


非常感谢你的建议

在本例中,您正在查看的语法节点引用的是类型而不是符号。如果传入的节点不是符号,则GetSymbolInfo将返回null。您想使用
semanticModel.GetTypeInfo(interfaceBaseTypeSyntax)

在发布后这么快就发现这一点是相当尴尬的,但解决方案似乎是引用
标识符
,它是
SimpleBaseTypeSyntax
的后代

var interfaceSymbolInfo =
semanticModel.GetSymbolInfo(interfaceBaseTypeSyntax.DescendantNodes().First());
并致电:

var interfaceTypeInfo = 
semanticModel.GetTypeInfo(interfaceBaseTypeSyntax.DescendantNodes().First());
然后,我可以使用
interfaceTypeInfo.Type.IsInterface
验证我是否确实找到了接口类型,还可以访问
interfaceTypeInfo.Type.GetMembers()

答案通过语法可视化工具盯着我的脸


我暂时不讨论这个问题,以防其他人有更好的解决方案。。。谢谢

谢谢,但实际上我使用的是interfaceBaseTypeSyntax,而不是作为子代包含在其中的标识符标记。很好!经常问它会迫使你以另一种方式思考它…@Jeremythonpson-是的,这正是发生的事情。我不得不重新审视我所采取的所有步骤,然后我看了看语法可视化程序,发现有子节点,特别是标识符,它当然是查找符号或类型信息所需的逻辑标识符。。。
var interfaceSymbolInfo =
semanticModel.GetSymbolInfo(interfaceBaseTypeSyntax.DescendantNodes().First());
var interfaceTypeInfo = 
semanticModel.GetTypeInfo(interfaceBaseTypeSyntax.DescendantNodes().First());