Symbolがインタフェース内の何かの実装であるかどうかをRoslynに知ることは可能でしょうか?例えば、Dispose()
をIDisposable
で?Roslyn - インタフェースのシンボル実装ですか?
私はDispose()
メソッドを表すシンボルを持っていますが、私が見る限り、IDisposable
インターフェイスで定義されているメソッドの実装であることを示すプロパティはありません。
Symbolがインタフェース内の何かの実装であるかどうかをRoslynに知ることは可能でしょうか?例えば、Dispose()
をIDisposable
で?Roslyn - インタフェースのシンボル実装ですか?
私は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));
}
実際には容易ではない、と - あなたの解釈に依存する - 不可能でさえ公共のタイプのために。詳細については、[FindImplementedInterfaceMembersAsync](http://source.roslyn.codeplex.com/#Microsoft.CodeAnalysis.Workspaces/FindSymbols/SymbolFinder_Hierarchy.cs,2ff44ec7ffcdbeaf)のソースコードを参照してください。コメントに注目してください。「メソッドは、その型を含む型がインタフェースを実装していると述べていなくても、インタフェースメソッドを実装できます。 –