:ここ
public interface ITest
{
void DoSomething();
}
public class Test : ITest
{
public void DoSomething()
{
}
}
は、Test
クラスが正常にC#の仕様で定義されているように、ITest
インタフェースを実装し
(たとえば13.4.2 Interface mappingのために)あなたはこの結果を調べると(.NET ReflectorやILDASMなどのツールを使用して)コンパイルされたアセンブリのコードを表示すると、次のようになります。
...はい...ここでは、テストのDoSomethingメソッドとITestのDoSomethingメソッドを関連付けるアセンブリメタデータには何もありません。 VB.NETで
、それはあなたがそれをコンパイルすることを確認するImplements
キーワードを追加する必要があります、違う:
Public Interface ITest
Sub DoSomething()
End Interface
Public Class Test
Implements ITest
Public Sub DoSomething() Implements ITest.DoSomething
End Sub
End Class
ご覧のとおり、VB.NETで、あなたが明示的にメソッドを関連付ける必要がありますあなたはILは、VB.NETの場合、アセンブリ内に作成されたものを分析する場合にはインタフェースのメソッドを持つクラスは、と、あなたはこれを見つけることができます:だから
.method public newslot virtual final instance void DoSomething() cil managed
{
.override TestVB.ITest::DoSomething
.maxstack 8
L_0000: nop
L_0001: nop
L_0002: ret
}
、VBコンパイルアセンブリと、情報はそこにあり、C#コンパイルアセンブリではありません。それは言語によって異なります。実際にはCLRエンジンは実行時のマッピングに使用されます。
InterfaceMapping im = typeof(Test).GetInterfaceMap(typeof(ITest));
しかし、あなたはメタデータだけを見てこれを決定する必要がある場合、あなたはそのコードを記述する必要があります:あなたは、プロセス内のアセンブリを注入することができた場合は
、このコードでは、インターフェイスのマッピングを決定することができますあなた自身。それは簡単ではない、特にジェネリック薬で。また、C#で忘れないでください、パブリックメソッドは暗黙的に複数のインターフェイスを実装できます。助けることができる
リンク:Mono.Cecil something like Type.GetInterfaceMap?
あなたの説明とあなたが提供したリンクのコード(Cecilの 'GetOriginalBaseMethod'メソッドに導かれました)は私が必要としていたものです。どうもありがとうございました。 –