【问题标题】:Roslyn - Is symbol implementation of interface?Roslyn - 是接口的符号实现吗?
【发布时间】:2017-06-23 19:24:07
【问题描述】:

是否可以通过 Roslyn 知道 Symbol 是否是接口中某些内容的实现?例如Dispose() in IDisposable?

我有一个代表Dispose() 方法的符号,但据我所知,没有属性表明它是IDisposable 接口定义的方法的实现。

【问题讨论】:

  • 这实际上并不容易,而且 - 根据您的解释 - 公共类型甚至不可能。有关详细信息,请参阅 FindImplementedInterfaceMembersAsync 的源代码。注意注释:“一个方法可以实现一个接口方法,即使它的包含类型没有声明它实现了接口。”

标签: c# roslyn roslyn-code-analysis


【解决方案1】:

当然可以。

只为您的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));
}

【讨论】:

  • 请注意,这不适用于泛型接口。
  • @SLaks 我们如何才能让它与通用接口一起正常工作?
【解决方案2】:

您可能会发现 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();
}

【讨论】:

  • 该方法存在于哪个nuget包/版本中?
  • 才发现这些扩展都是内部的,不能直接使用
猜你喜欢
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
  • 2019-12-28
  • 1970-01-01
  • 1970-01-01
  • 2018-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多