我需要创建一个动态枚举,然后能够使用Type.GetType()获取该类型。这可能吗?
下面的代码将创建一个动态枚举,并尝试使用它的限定名称。如果我第一次存储程序集(使用AssemblyBuilderAccess.RunAndSave),这很好。但是,如果我只使用AssemblyBuilderAccess.Run,这是不可能的;发生BindingFailure错误;无法找到装配。我的印象是Run选项允许创建和使用,而无需实际存储程序集(或访问不同的Builders)。
(注意:Type.GetType()的以下代码用法不是我的。我无法更改该代码。)
如何在不存储程序集的情况下创建动态枚举并引用它?
private Type CreateType()
{
// Define the assembly.
System.Reflection.Emit.AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(new System.Reflection.AssemblyName("temporaryAssembly"), AssemblyBuilderAccess.Run);
// Actually create it.
System.Reflection.Emit.ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("temporaryAssembly");
// Create the enum.
System.Reflection.Emit.EnumBuilder enumBuilder = moduleBuilder.DefineEnum("Temp", System.Reflection.TypeAttributes.Public, typeof(int));
/* Populate the enum. */
return enumBuilder.CreateType();
}
private void DoStuff()
{
Type t = CreateType();
Type createAnotherOfSameType = Type.GetType(t.AssemblyQualifiedName);
}/
答案 0 :(得分:2)
现在实际记录在MSDN上:
GetType仅适用于从磁盘加载的程序集。如果你调用GetType 查找使用。定义的动态程序集中定义的类型 System.Reflection.Emit服务,您可能会得到不一致的行为。 行为取决于动态程序集是否持久, 也就是说,使用RunAndSave创建或保存访问模式 System.Reflection.Emit.AssemblyBuilderAccess枚举。 [...]如果 调用GetType时,程序集尚未保存到磁盘 返回null。 GetType不了解瞬态动态 组件;因此,调用GetType来检索a中的类型 瞬态动态程序集返回null。
然后,文档继续说您可以订阅AppDomain.AssemblyResolve来解析动态程序集。
答案 1 :(得分:0)
我不明白你在那里做什么。两个问题:1)第二行只是试图再次获得对Type的引用,这将是与第一行相同的引用;这不是你得到的实例。 2)IIRC,对于内存类型/程序集,AssemblyQualifiedName为null。
-Oisin