如何通过roslyn检查两种方法是否匹配签名?

问题描述

我正在尝试编写一个分析器来检查一个方法是否正在实现一个接口方法(隐式),如果一个接口提供认实现,很容易错过。给定类上的潜在方法符号列表并获取该类实现的所有接口上的所有方法的列表,我正在执行以下操作

classMethods
.Where(methodSymbol => !interfaceMethods
    .Any(x =>
        x.Name == methodSymbol.Name &&
        SymbolEqualityComparer.Default.Equals(x.ReturnType,methodSymbol.ReturnType) &&
        x.Parameters.Select(p => p.Type).SequenceEqual(methodSymbol.Parameters.Select(p => p.Type))))

这主要适用于使用泛型的情况,例如以下:

        class A : IA
        {   
            public void MethodName<T>(List<T> a) {}
        }
        interface IA 
        {
            public void MethodName<T>(List<T> a) {}
        }

从语义模型的角度来看,这两种类型是不同的。有没有办法获取泛型参数数据?我真的宁愿避免回到语法模型来解密两者中的 T 意味着相同的事情。

解决方法

解决方法如下

classMethods
    .Where(methodSymbol => !interfaceMethods
        .Select(interfaceMethod => classSymbol.FindImplementationForInterfaceMember(interfaceMethod))
        .Any(implementation => SymbolEqualityComparer.Default.Equals(methodSymbol,implementation)))