2017-02-06 7 views
1

Symbolがインタフェース内の何かの実装であるかどうかをRoslynに知ることは可能でしょうか?例えば、Dispose()IDisposableで?Roslyn - インタフェースのシンボル実装ですか?

私はDispose()メソッドを表すシンボルを持っていますが、私が見る限り、IDisposableインターフェイスで定義されているメソッドの実装であることを示すプロパティはありません。

+0

実際には容易ではない、と - あなたの解釈に依存する - 不可能でさえ公共のタイプのために。詳細については、[FindImplementedInterfaceMembersAsync](http://source.roslyn.codeplex.com/#Microsoft.CodeAnalysis.Workspaces/FindSymbols/SymbolFinder_Hierarchy.cs,2ff44ec7ffcdbeaf)のソースコードを参照してください。コメントに注目してください。「メソッドは、その型を含む型がインタフェースを実装していると述べていなくても、インタフェースメソッドを実装できます。 –

答えて

3

確かに可能です。

ちょうどあなたの 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)); 
} 
+2

ジェネリックインターフェイスでは正しく動作しないことに注意してください。 – SLaks

+1

@SLaksジェネリックインターフェイスでも、これをどうすれば正しく動作させることができますか? – TWT

関連する問題