问题描述
以下源代码显示了我想要做的事情。 创建两个从通用基类动态继承的类。 并将彼此的 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 (将#修改为@)