: 여기
public interface ITest
{
void DoSomething();
}
public class Test : ITest
{
public void DoSomething()
{
}
}
에서, Test
클래스가 성공적으로 C#을 사양에 정의 된대로 ITest
인터페이스를 구현을
(예를 13.4.2 Interface mapping에 대한)이 결과를 살펴보면 컴파일 된 어셈블리 코드 (도구와 같은 .NET 반사판 또는 ILDASM 등을 사용)이 표시됩니다
.method public hidebysig newslot virtual final instance void DoSomething() cil managed
{
.maxstack 8
L_0000: nop
L_0001: ret
}
그리고 ... 예 ... 테스트의 DoSomething 메서드와 ITest의 DoSomething 메서드를 관련시킬 어셈블리 메타 데이터에는 아무것도 없습니다. 보시다시피
Public Interface ITest
Sub DoSomething()
End Interface
Public Class Test
Implements ITest
Public Sub DoSomething() Implements ITest.DoSomething
End Sub
End Class
은, VB.NET, 당신은 명시 적으로 방법을 관계해야
VB.NET에서
, 당신은 확실히 그것을 컴파일 만들기 위해 Implements
키워드를 추가해야합니다, 다르다 당신이 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' 메쏘드로 안내해주었습니다) 정확히 제가 필요로하는 것입니다. 고맙습니다. –