在基类的泛型参数中发出相互引用的类时得到 TypeLoadException

问题描述

以下源代码显示了我想要做的事情。 创建两个从通用基类动态继承的类。 并将彼此的 TypeBuilder 设置为该通用参数。 最后调用CreateType,抛出TypeLoadException。

两个类需要知道对方的Type,因为它们有父子关系,一些库方法会检查泛型参数的Type以提供基于反射的功能

(TypeLoadException:无法从程序集“Dynamicclasstest,Version=0.0.0.0,Culture=neutral,PublicKeyToken=null”加载类型“Test.Type_2”。)

我已阅读this post,但没有帮助。

using System.Reflection;
using System.Reflection.Emit;

namespace Test
{
    public class BaseClass<T>
    {
    }

    static class Program
    {
        static void Main()
        {
            var assembly = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName($"Dynamicclasstest"),AssemblyBuilderAccess.Run);
            var moduleBuilder = assembly.DefineDynamicModule($"DynamicTypes");

            var typeBuilder1 = moduleBuilder.DefineType("Test.Type_1",TypeAttributes.Public);
            var typeBuilder2 = moduleBuilder.DefineType("Test.Type_2",TypeAttributes.Public);

            typeBuilder1.SetParent(typeof(BaseClass<>).MakeGenericType(typeBuilder2));
            typeBuilder2.SetParent(typeof(BaseClass<>).MakeGenericType(typeBuilder1));

            var type1 = typeBuilder1.CreateType();
            var type2 = typeBuilder2.CreateType();
        }
    }
}

如果我把SetParent改成下面的源代码(自引用)就可以了,但是我想做的是互相引用。

typeBuilder1.SetParent(typeof(BaseClass<>).MakeGenericType(typeBuilder1));
typeBuilder2.SetParent(typeof(BaseClass<>).MakeGenericType(typeBuilder2));

有什么想法可以解决这个问题,或者我可以解决这个问题吗?

[编辑]

此时,我添加了两个动态接口来避免这个问题。 我必须编写更多的反射逻辑来获得实现接口的真实类类型,以使它们正常工作。 但是我想做的事情已经实现了。

无论如何,任何更好的想法都会受到欢迎。

var typeBuilder1_IF = moduleBuilder.DefineType("Test.Type_1_IF",TypeAttributes.Public | TypeAttributes.Interface | TypeAttributes.Abstract);
var typeBuilder2_IF = moduleBuilder.DefineType("Test.Type_2_IF",TypeAttributes.Public | TypeAttributes.Interface | TypeAttributes.Abstract);
    
var type1_IF = typeBuilder1_IF.CreateType();
var type2_IF = typeBuilder2_IF.CreateType();

var typeBuilder1 = moduleBuilder.DefineType("Test.Type_1",TypeAttributes.Public,typeof(BaseClass<>).MakeGenericType(type2_IF));
typeBuilder1.AddInterfaceImplementation(type1_IF);

var typeBuilder2 = moduleBuilder.DefineType("Test.Type_2",typeof(BaseClass<>).MakeGenericType(type1_IF));
typeBuilder2.AddInterfaceImplementation(type2_IF);
    
var type1 = typeBuilder1.CreateType();
var type2 = typeBuilder2.CreateType();

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)