是否可以通过Roslyn了解Symbol是否是接口中某些内容的实现?例如instance Algebraic.C a => Absolute.C (Complex a)
中的Dispose()
?
我有一个代表IDisposable
方法的符号,但据我所知,没有任何属性表明它是由Dispose()
接口定义的方法的实现。 / p>
答案 0 :(得分:5)
当然可能。
仅适用于您的Dispose
示例:
var disposeMethodSymbol = ...
var type = disposeMethodSymbol.ContainingType;
var isInterfaceImplementaton = type.FindImplementationForInterfaceMember(
type.Interfaces.Single().
GetMembers().OfType<IMethodSymbol>().Single()) == disposeMethodSymbol ;
但如果它是一般用途,您需要更一般地编写它,请使用AllInterfaces
而不是Interfaces
,并确保不使用Single
。
示例:
public static bool IsInterfaceImplementation(this IMethodSymbol method)
{
return method.ContainingType.AllInterfaces.SelectMany(@interface => @interface.GetMembers().OfType<IMethodSymbol>()).Any(interfaceMethod => method.ContainingType.FindImplementationForInterfaceMember(interfaceMethod).Equals(method));
}
答案 1 :(得分:0)
您可能会发现Roslyn的这套扩展方法很有用: http://sourceroslyn.io/#Microsoft.CodeAnalysis.Workspaces/ISymbolExtensions.cs,93
尤其是这种void*
方法:
void**