Если я это C# образец:
public interface ITest
{
void DoSomething();
}
public class Test : ITest
{
public void DoSomething()
{
}
}
Здесь Test
класс успешно реализует интерфейс ITest
, как это определено в C# спецификации (например 13.4.2 Interface mapping)
Если проанализировать результат этого кода скомпилированной сборки (с использованием такого инструмента, как .NET Reflector или ILDASM), вы увидите следующее:
.method public hidebysig newslot virtual final instance void DoSomething() cil managed
{
.maxstack 8
L_0000: nop
L_0001: ret
}
И ... да ... здесь нет ничего в метаданных сборки, которые будут относить метод DoSomething в тесте к методу DoSomething в ITest.
В 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?
Ваше объяснение и код в приведенной ссылке (что привело меня к методу «GetOriginalBaseMethod» Сесила) именно то, что мне нужно. Большое спасибо. –