你需要這裏的主要觀點是:TypeBuilder
被定義派生自Type
。所以,即使你還沒有確定一個類型(通過調用CreateType()
),你可以用它來聲明另一個類型的局部變量。
我遇到的另一個障礙是GetConstructor()
未完成TypeBuilder
不起作用(它會引發異常)。但是,如果您明確創建默認構造函數,則可以通過ConstructorBuilder
來調用它。
static void Main()
{
var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(
new AssemblyName("foo"), AssemblyBuilderAccess.RunAndSave);
var module = assemblyBuilder.DefineDynamicModule("foo.dll");
var aType = module.DefineType(
"A", TypeAttributes.Public | TypeAttributes.Class);
var bType = module.DefineType(
"B", TypeAttributes.Public | TypeAttributes.Class);
var aCtor = aType.DefineDefaultConstructor(MethodAttributes.Public);
var bCtor = bType.DefineDefaultConstructor(MethodAttributes.Public);
CreateMethodM(aType, bType, bCtor);
CreateMethodM(bType, aType, aCtor);
aType.CreateType();
bType.CreateType();
assemblyBuilder.Save("foo.dll");
}
static void CreateMethodM(
TypeBuilder thisType, Type otherType, ConstructorInfo otherCtor)
{
var method = thisType.DefineMethod(
"M", MethodAttributes.Private, typeof(void), Type.EmptyTypes);
var il = method.GetILGenerator();
var local = il.DeclareLocal(otherType);
il.Emit(OpCodes.Newobj, otherCtor);
il.Emit(OpCodes.Stloc, local);
il.Emit(OpCodes.Ret);
}
會有什麼幫助? –
@phoog:他不如等待某人做他的工作,然後...... –
我實際上並沒有在C#中做這些......這只是循環依賴的一個例子 –