使用反射.发出以生成相互引用的类型



我想在运行时通过反射生成相互引用的类型

对于静态代码,我会这样做
public class Order
{
    public int Id { get; set; }
    public Customer Customer { get; set; }
}
public class Customer
{
    public int Id { get; set; }
    public Order Order { get; set; }
}

我可以用值类型属性成功地生成我的Order和我的OrderDetails Type。

代码如下所示

var aName = new System.Reflection.AssemblyName("DynamicAssembly");
var ab = AppDomain.CurrentDomain.DefineDynamicAssembly(
    aName, System.Reflection.Emit.AssemblyBuilderAccess.Run);
var mb = ab.DefineDynamicModule(aName.Name);
var tb = mb.DefineType("Order",
    System.Reflection.TypeAttributes.Public, typeof(Object));
var pbId = tb.DefineProperty("Id", PropertyAttributes.None, typeof(int), null);

现在我被困在这行:

var pbCustomer = tb.DefineProperty("Customer", PropertyAttributes.None, ???, null);

我需要将属性的类型传递给DefineProperty方法,但此时类型不存在。现在我可以在这里为customer创建一个类型构建器,并使用tb.CreateType()来获取类型,但这没有帮助,因为customer也需要对Order的引用。

您的最后一段大致正确,但TypeBuilder派生自Type,因此您不需要调用CreateType。也就是说,为每个递归类型创建类型构造器,然后定义属性,将各自的构造器本身作为返回类型传递。

相关内容

  • 没有找到相关文章

最新更新