微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何通过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)))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。