如何使用Roslyn查看一个类是否已实现接口

4

我对Roslyn还很陌生,所以希望这不是一个太蠢的问题。

我想要找到一种方法来查看一个类是否已经实现了接口的所有方法,如果没有实现,则像内置的“实现接口”一样突出显示该接口。

目前,我可以查看方法名称是否已实现,但我还没有找到一种方法来查看方法是否设置了正确的返回类型。

1个回答

6
您可以使用ITypeSymbol.FindImplementationForInterfaceMember来实现此目的。
基本上您需要做的就是遍历接口的所有IMethodSymbol,并检查问题类型是否定义了一个方法,该方法等于上述方法返回的值。
以下是草稿:
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
1
好的,你应该在 if (!memberFound){} 中收集 interfaceMember。所以,你需要用 notFound.Add(interfaceMember) 替换 return false,用 return !notFound.Any() 替换 return true;。在返回之前,你可以对 notFound 集合做任何你想做的事情。 - Tamas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接