2016-06-22 5 views
3

私はまだRoslynで新しくなっています。うまくいけば、これはあまりにも愚かではありません。クラスがRoslynとのインターフェイスを実装しているかどうかを確認する方法

私が探しているのは、クラスがインターフェイスのすべてのメソッドを実装している場合はを表示する方法ですが、そうでない場合は、組み込みの「実装インターフェイス」のようにインターフェイスを強調表示します。

これまでのところ、メソッド名が実装されているかどうかを確認できましたが、正しいreturntypeがメソッドに設定されているかどうかを確認する方法が見つかりませんでした。

答えて

3

この目的でITypeSymbol.FindImplementationForInterfaceMemberを使用できます。

基本的には、インターフェイスのすべてのIMethodSymbolを調べ、問題の型が上記のメソッドの戻り値と等しいメソッドを定義しているかどうかを確認する必要があります。

var interfaceType = ... 
var typeInQuestion = ... 
foreach(var interfaceMember in interfaceType.GetMembers().OfType<IMethodSymbol>()) 
{ 
    var memberFound = false; 
    foreach(var typeMember in typeInQuestion .GetMembers().OfType<IMethodSymbol>()) 
    { 
    if (typeMember.Equals(typeInQuestion.FindImplementationForInterfaceMember(interfaceMember))) 
    { 
     // this member is found 
     memberFound = true; 
     break; 
    } 
    } 
    if (!memberFound) 
    { 
    return false; 
    } 
} 
return true; 
+0

それは魔法のように動作:ここで

はドラフトです。ありがとう。私がすることができる場合は、すぐに迅速なフォローアップの質問は、それが実装されていないかを確認する簡単な方法はありますか? – Joshlo

+1

ええ、 'if(!memberFound){}'に 'interfaceMember'を集めてください。だから、 'return false'の代わりに' notFound.Add(interfaceMember) 'のようなものがあり、' return true; 'の代わりに' return!notFound.Any() 'が必要です。そして返す前に、あなたは 'notFound'セットであなたが望むものを何でもすることができます。 – Tamas

+0

ありがとう – Joshlo

関連する問題