당신이 (아마도 당신을 위해 작동하지 않는 코드의 작은 예제 코드를 표시)로 실행중인 문제에 대한 정교한 수 있을까요? TypeBuilder
은 Type
에서 파생되었으므로 상호 재귀 유형을 정의하려는 경우 형식을 참조 할 때마다 두 개의 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();
}
출처
2010-02-10 15:16:50
kvb
어셈블리의 유형을 추론합니다. 타입 유추는 소스 코드에서 명시 적으로 언급되지 않은 유형의 물건을 정적으로 추론하는 작업입니다 (F # 에서처럼 사용 된 방법으로 얻은 증거를 기반으로 함). 유형을 분석하는 것은 이름을 기반으로 유형을 찾는 것입니다. 어느 분이세요? –
유형을 해결하는 데 혼란스러워서 죄송합니다. –