Roslyn - 是接口的符号实现吗?

Roslyn - Is symbol implementation of interface?

是否可以通过 Roslyn 了解 Symbol 是否是接口中某物的实现?例如 Dispose()IDisposable?

我有一个代表 Dispose() 方法的符号,但据我所知,没有 属性 表明它是由 IDisposable界面。

当然有可能。

仅针对您的 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));
}

您可能会发现 Roslyn 的这组扩展方法很有用: http://sourceroslyn.io/#Microsoft.CodeAnalysis.Workspaces/ISymbolExtensions.cs,93

特别是这个ExplicitOrImplicitInterfaceImplementations方法:

public static ImmutableArray<ISymbol> ExplicitOrImplicitInterfaceImplementations(this ISymbol symbol)
{
    if (symbol.Kind != SymbolKind.Method && symbol.Kind != SymbolKind.Property && symbol.Kind != SymbolKind.Event)
        return ImmutableArray<ISymbol>.Empty;

    var containingType = symbol.ContainingType;
    var query = from iface in containingType.AllInterfaces
                from interfaceMember in iface.GetMembers()
                let impl = containingType.FindImplementationForInterfaceMember(interfaceMember)
                where symbol.Equals(impl)
                select interfaceMember;
    return query.ToImmutableArray();
}