我已经得到了从引用的DLL类型的解决策略。我卡在试图解决在正在编制的装配中定义的类型。我使用System.Reflection.Emit的API,没有第三方库。

例如:

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

什么是解决B的A的参考的最佳方式?

了解这个什么:

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

,其中类包含彼此的实例。

有没有一种最佳实践的方式来做到这一点?任何设计模式,我应该执行?我宁愿只使用System.Reflection.Emit图书馆的,但如果有更好的方法来做到这一点或这不能跟他们做,然后用其他图书馆(S)是可以接受的。

由于

有帮助吗?

解决方案

你能否阐述一下你正在运行到(也许显示的代码是不是为你工作代码的一个小例子)的问题?由于TypeBuilderType派生,如果你想定义相互递归类型,您可以通过两个TypeBuilders无论你想参考类型。

修改

有没有需要“解决”的类型。您可以访问TypeBuilders每个和可以使用它们,就像它们是完全定义的类型。下面是生成您在更新请求的代码示例:

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();
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top