如何找出 IDynamicMemberReferenceOperation 引用了哪些方法?

How to figure out which methods IDynamicMemberReferenceOperation refers to?

我的 OperationWalker 中有以下功能:

public override void VisitDynamicInvocation(IDynamicInvocationOperation operation)
{
    var memberReferenceOp = (IDynamicMemberReferenceOperation)operation.Operation;
    switch (memberReferenceOp.Instance.Type)
    {
        case INamedTypeSymbol type:
            {
                var memberName = memberReferenceOp.MemberName;
                var members = type.GetMembers(memberName);
                if (members.Length > 1)
                {
                    // WHAT DO I DO HERE ???
                }
                else
                {
                    Result.Add((IMethodSymbol)members[0]);
                }
                break;
            }

        case IDynamicTypeSymbol dynamicType:
            Unresolved.Add((operation.Syntax, memberReferenceOp.MemberName));
            break;
    }
}

当使用动态参数调用普通类型(非动态)的方法并且可以选择具有相同名称的目标方法时,我一无所知。例如:

class A
{
    public void Get(int i){}
    public void Get(string s){}
    public void Get(object o){}
    public void Get(double s, int precision){}
}
...
dynamic x = ...;
A a;
a.Get(x)

在这种情况下,可以调用前 3 个 A.Get 方法中的任何一个,具体取决于 x 的实际类型。但不是第四种方法。

Roslyn 有没有办法获取这些信息?具体来说,在此示例中,我想获取前 3 个 Get 方法的符号。

逻辑很重要,因为需要考虑:

  1. 默认参数,所以只计算参数可能不够
  2. 类型转换
  3. 可见范围
  4. 参数数量
  5. 可以使用命名语法以任意顺序传递参数

将它们结合在一起,我们得到了非常重要的逻辑。 SemanticModel 或其他任何地方是否有任何内容可以帮助获得答案?

我想通了,而且很简单 - SemanticModel.GetSymbolInfo。当有完全匹配它的Symbol属性returns它。当有多个候选者时,例如传递的参数之一是 dynamic,那么 属性 CandidateSymbols 包含所有选项。

我没有用扩展方法测试过,所以可能那里有差距。