C#Roslyn Analyzer获得方法/构造函数等的防御/实现

C#Roslyn Analyzer获得方法/构造函数等的防御/实现,c#,.net,roslyn,code-analysis,roslyn-code-analysis,C#,.net,Roslyn,Code Analysis,Roslyn Code Analysis,我正在编写代码分析规则,下一步应该检查: 如果类派生自IInterface 如果是,请检查它是否包含方法MyMethod 此方法是否调用Foo 基本上,从IInterface派生的每个类都必须具有MyMethod,并且它应该调用Foo 这非常容易实现,我只需将我的分析器注册为SyntaxKind.ClassDeclarationSyntax。在那里,我将检查类是否派生自IInterface,并检查是否存在MyMethod 但是,如果MyMethod调用调用SomeFunction调用Foo,该怎

我正在编写代码分析规则,下一步应该检查:

  • 如果类派生自
    IInterface
  • 如果是,请检查它是否包含方法
    MyMethod
  • 此方法是否调用
    Foo
  • 基本上,从
    IInterface
    派生的每个类都必须具有
    MyMethod
    ,并且它应该调用
    Foo

    这非常容易实现,我只需将我的分析器注册为
    SyntaxKind.ClassDeclarationSyntax
    。在那里,我将检查类是否派生自
    IInterface
    ,并检查是否存在
    MyMethod

    但是,如果
    MyMethod
    调用调用
    SomeFunction
    调用
    Foo
    ,该怎么办?因此,
    MyMethod
    不直接调用
    Foo
    ,而是调用
    SomeFunction
    ,调用我们所需要的

    在我看来,最好的方法就是迭代
    MyMethod
    中的所有方法调用/对象创建/etc,然后转到这些方法/构造函数/etc的定义,搜索
    Foo
    调用(是的,这可能对性能有很大影响,但我仍然需要它(或者你可以推荐其他方法))

    但问题是,我的主要问题是:

    我如何获得我点击的符号的定义/实现

    我尝试了
    SymbolFinder
    及其所有方法,如
    FindDefinition
    FindImplementation
    ,等等。但这不起作用(我不知道它是否真的起作用,只是我没有
    解决方案


    我能做什么?谢谢

    如果它调用一个外部程序集(引用但非源代码),该程序集包含一个恰好调用
    Foo
    的方法,该怎么办?如果(random.Next()<0)Foo(),那么即使它永远不会调用
    Foo
    ,它也算吗?如果它调用在派生类中被重写的
    MyVirtualMethod(){Foo();}
    ,从而不再调用
    Foo
    ,该怎么办?只是扮演魔鬼的代言人;这些情况可能永远不会发生在您的代码库中,或者您可以制定简单的规则来涵盖它们,但它们仍然值得考虑,因为糟糕的分析往往比没有更糟糕。@Jeroenmoster,老实说,这并不重要,因为这条规则就像一个指南
    if(random.Next()<0)Foo()
    ,yes,这将视为调用,以及
    MyVirtualMethod(){Foo();}
    。我真的不介意这一切。我只是提供了信息,但我真的想知道如何获得定义/实现。