检查方法是不是实现了标有属性的接口方法

Posted

技术标签:

【中文标题】检查方法是不是实现了标有属性的接口方法【英文标题】:Check if method implements interface method marked with attribute检查方法是否实现了标有属性的接口方法 【发布时间】:2016-02-28 13:47:00 【问题描述】:

Roslyn 是否有可能判断一个类方法是否实现了某个带有属性标记的接口方法?

特别是在 wcf 中,我们使用接口来描述服务契约。它的每个方法都应该用OperationContractAttribute 标记,如下例所示

[ServiceContract]
public interface ISimleService

    [OperationContract]
    string GetData(int value);


public class SimleService : ISimleService

    public string GetData(int value)
    
        return string.Format("You entered: 0", value);
    

在 Roslyn 中,ISymbol 接口为我们提供了 GetAttributes() 方法,但在 SimleService.GetData() 方法上调用它返回 0。在 ISimleService.GetData() 声明上调用它按预期返回 OperationContractAttribute

所以一般来说,我必须检查类层次结构以找到所有实现的接口,然后遍历层次结构以找到合适的方法。这是一个很难的方法,我想应该有一个更简单的方法。

【问题讨论】:

在 Wcf 服务中,接口需要用属性OperationContract 标记它们的方法。与其搜索接口实现,不如简单地查找所有标有ServiceContract 的接口并找到该接口中的所有方法,然后应用过滤器查看它们是否都标记为OperationContract 【参考方案1】:

是的,可以确定一个方法是否是接口方法的实现。这是执行此操作的代码:

methodSymbol.ContainingType
    .AllInterfaces
     .SelectMany(@interface => @interface.GetMembers().OfType<IMethodSymbol>())
     .Any(method => methodSymbol.Equals(methodSymbol.ContainingType.FindImplementationForInterfaceMember(method)));

您可以修改它以实际获取已实现的方法,然后您可以检查属性。

【讨论】:

是的,最后我得到了类似的东西

以上是关于检查方法是不是实现了标有属性的接口方法的主要内容,如果未能解决你的问题,请参考以下文章

如何以与静态类型检查兼容的方式实现接口?

如何检查对象是不是具有某些方法/属性?

如何检查对象是不是实现了接口? [复制]

在 JavaScript 中,是不是有更简单的方法来检查属性的属性是不是存在?

检查 JavaScript 中是不是存在深度嵌套对象属性的最简单方法是啥? [复制]

检查实例的类是不是实现了接口?