Roslyn是否有可能弄清楚一个类方法是否实现了一些用属性标记的接口方法?
特别是在wcf中,我们使用interface描述服务契约。它的每个方法都应标有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
。
所以一般来说,我必须检查类层次结构以找到所有实现的接口,然后遍历层次结构以找到合适的方法。这是一个很难的方法,我想应该有一个更简单的方法。
答案 0 :(得分:8)
是的,可以找出方法是否是接口方法的实现。这是执行此操作的代码:
methodSymbol.ContainingType
.AllInterfaces
.SelectMany(@interface => @interface.GetMembers().OfType<IMethodSymbol>())
.Any(method => methodSymbol.Equals(methodSymbol.ContainingType.FindImplementationForInterfaceMember(method)));
您可以修改它以实际获取已实现的方法,然后您可以检查属性。