3

참조 된 dll에서 유형을 확인하기위한 전략이 있습니다. 나는 컴파일되고있는 어셈블리에 정의 된 타입을 해결하려고 노력하고있다. 제 3 자 라이브러리가없는 System.Reflection.Emit API를 사용하고 있습니다. 예를 들어System.Reflection.Emit을 사용하여 .NET 컴파일러를 작성하려고 시도합니다. 어떻게 입력 해상도를 변경합니까?

:

class A {} 
class B 
{ 
    public A AnInstanceOfA {get; private set;} 
} 

(A)의 B의 참조를 해결하는 가장 좋은 방법은 무엇입니까? 이것에 대해

무엇 :

class A 
{ 
    B AnInstanceOfB {get; set;} 
} 
class B 
{ 
    A AnInstanceOfA {get; set;} 
} 

클래스는 서로의 인스턴스를 포함 할 경우.

이렇게하는 것이 가장 좋은 방법이 있습니까? 내가 구현해야하는 디자인 패턴은 무엇입니까? System.Reflection.Emit 라이브러리 만 사용하는 것이 더 좋지만이 작업을 수행하는 더 좋은 방법이 있거나이 작업을 수행 할 수없는 경우 다른 라이브러리를 사용하는 것이 좋습니다.

감사

+3

어셈블리의 유형을 추론합니다. 타입 유추는 소스 코드에서 명시 적으로 언급되지 않은 유형의 물건을 정적으로 추론하는 작업입니다 (F # 에서처럼 사용 된 방법으로 얻은 증거를 기반으로 함). 유형을 분석하는 것은 이름을 기반으로 유형을 찾는 것입니다. 어느 분이세요? –

+0

유형을 해결하는 데 혼란스러워서 죄송합니다. –

답변

3

당신이 (아마도 당신을 위해 작동하지 않는 코드의 작은 예제 코드를 표시)로 실행중인 문제에 대한 정교한 수 있을까요? TypeBuilderType에서 파생되었으므로 상호 재귀 유형을 정의하려는 경우 형식을 참조 할 때마다 두 개의 TypeBuilder을 전달할 수 있습니다.

편집

유형을 "해결"할 필요가 없습니다. 각각에 대해 TypeBuilder에 액세스 할 수 있으며 완전히 정의 된 유형 인 것처럼 사용할 수 있습니다. 다음은 업데이트에서 요청한 코드를 생성하는 예제입니다.

private void DefineAutoProp(string name, Type t, TypeBuilder tb) 
{ 
    var fldName = name.Substring(0, 1).ToLower() + name.Substring(1); 
    var fld = tb.DefineField(fldName, t, FieldAttributes.Private); 
    var prop = tb.DefineProperty(name, PropertyAttributes.None, t, null); 
    var getter = tb.DefineMethod("get_" + name, MethodAttributes.Public, t, null); 
    var ilg = getter.GetILGenerator(); 
    ilg.Emit(OpCodes.Ldarg_0); 
    ilg.Emit(OpCodes.Ldfld, fld); 
    ilg.Emit(OpCodes.Ret); 
    var setter = tb.DefineMethod("set_" + name, MethodAttributes.Public, typeof(void), new[] { t }); 
    ilg = setter.GetILGenerator(); 
    ilg.Emit(OpCodes.Ldarg_0); 
    ilg.Emit(OpCodes.Ldarg_1); 
    ilg.Emit(OpCodes.Stfld, fld); 
    ilg.Emit(OpCodes.Ret); 
    prop.SetGetMethod(getter); 
    prop.SetSetMethod(setter); 
} 

public void DefineTypes() 
{ 
    var ab = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("test"), AssemblyBuilderAccess.Run); 
    var mb = ab.DefineDynamicModule("test"); 
    var A = mb.DefineType("A", TypeAttributes.Public | TypeAttributes.Class); 
    var B = mb.DefineType("B", TypeAttributes.Public | TypeAttributes.Class); 
    DefineAutoProp("AnInstanceOfA", A, B); 
    DefineAutoProp("AnInstanceOfB", B, A); 
    A.CreateType(); 
    B.CreateType(); 
} 
+0

나는 그 질문에 대해 자세히 설명했다. 편집을 참조하십시오. 감사. –

+0

@wawa - 요청한 것을 수행하는 방법에 대한 예를 보려면 제 편집을 참조하십시오. – kvb

+0

A와 B에서 정의 된 다른 메소드와 속성이 있다면 어떻게 될까요? 모든 유형의 멤버를 만들기 전에 DefineAutoProp에서 TypeBuilder를 사용할 수 있습니까? –