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();
}
是否可以通过 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();
}