3
我还是Roslyn
的新手,所以希望这不是太愚蠢的问题。如何查看一个班级是否实施了与Roslyn的接口
如果一个类已经实现了接口的所有方法,并且如果不是接口的突出显示,就像构建在“实现接口”中那样,我正在寻找的方法是。
到目前为止,我可以看到方法名是否被实现,但我还没有找到方法来查看是否在方法上设置了正确的returntype。
我还是Roslyn
的新手,所以希望这不是太愚蠢的问题。如何查看一个班级是否实施了与Roslyn的接口
如果一个类已经实现了接口的所有方法,并且如果不是接口的突出显示,就像构建在“实现接口”中那样,我正在寻找的方法是。
到目前为止,我可以看到方法名是否被实现,但我还没有找到方法来查看是否在方法上设置了正确的returntype。
您可以使用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;
它的工作原理就像一个魅力。谢谢。如果我可以,只是一个快速跟进问题,有没有一种简单的方法来看看它没有实现? – Joshlo
好的:你应该在'if(!memberFound){}'中收集'interfaceMember's。因此,不是'return false',而是'notFound.Add(interfaceMember)',而不是'return true;',你需要'return!notFound.Any()'。在返回之前,你可以用'notFound'设置来做任何你想做的事情。 – Tamas
非常感谢 – Joshlo