如何使用Emit定义相互引用的2个类型?

2019-06-04 08:37发布

问题:

想要使用Emit生成的2个类型:

public class User
{
    public int UserId { get; set; }
    public int DepartmentId { get; set; }
    public Department Department { get; set; }
    public DateTime CreateTime { get; set; }
}

public class Department
{
    public int DepartmentId { get; set; }
    public List<User> User { get; set; }
    public DateTime CreateTime { get; set; }
}

难点在,我们这里的类,发生了互相引用。
下面是我的代码:

        var assemblyName = new AssemblyName("DynamicTypes");
        var assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
        var moduleBuilder = assemblyBuilder.DefineDynamicModule("DynamicTypes");

        var typeBuilder = moduleBuilder.DefineType($"DynamicTypes.User", TypeAttributes.Public);

        var methodBuilder = typeBuilder.DefineProperty("Department", PropertyAttributes.None, typeof(), Type.EmptyTypes);

但是,我这里使用的DefineProperty的type参数,根本不知道怎么填,因为填任何一个类型,都需要知道所依赖的类型,这样就导致没法创建任何一个类型,所以进入了死胡同。
大神可有高见?
还望指教,多谢多谢

回答1:

typeof() => 使用Department的TypeBuilder,因为TypeBuilder也是Type类型