2016-06-22 33 views
3

我还是Roslyn的新手,所以希望这不是太愚蠢的问题。如何查看一个班级是否实施了与Roslyn的接口

如果一个类已经实现了接口的所有方法,并且如果不是接口的突出显示,就像构建在“实现接口”中那样,我正在寻找的方法是

到目前为止,我可以看到方法名是否被实现,但我还没有找到方法来查看是否在方法上设置了正确的returntype。

回答

3

您可以使用ITypeSymbol.FindImplementationForInterfaceMember来实现此目的。

基本上你需要的是通过接口的所有IMethodSymbol s并检查所讨论的类型是否定义了一个等于上述方法的返回值的方法。

这里有一个草案:

var interfaceType = ... 
var typeInQuestion = ... 
foreach(var interfaceMember in interfaceType.GetMembers().OfType<IMethodSymbol>()) 
{ 
    var memberFound = false; 
    foreach(var typeMember in typeInQuestion .GetMembers().OfType<IMethodSymbol>()) 
    { 
    if (typeMember.Equals(typeInQuestion.FindImplementationForInterfaceMember(interfaceMember))) 
    { 
     // this member is found 
     memberFound = true; 
     break; 
    } 
    } 
    if (!memberFound) 
    { 
    return false; 
    } 
} 
return true; 
+0

它的工作原理就像一个魅力。谢谢。如果我可以,只是一个快速跟进问题,有没有一种简单的方法来看看它没有实现? – Joshlo

+1

好的:你应该在'if(!memberFound){}'中收集'interfaceMember's。因此,不是'return false',而是'notFound.Add(interfaceMember)',而不是'return true;',你需要'return!notFound.Any()'。在返回之前,你可以用'notFound'设置来做任何你想做的事情。 – Tamas

+0

非常感谢 – Joshlo

相关问题