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