3

我需要创建一个动态枚举,然后能够使用 Type.GetType() 获取类型。这可能吗?

下面的代码将创建一个动态枚举,并尝试使用它的限定名称。如果我首先存储程序集(使用 AssemblyBuilderAccess.RunAndSave),这很好。但是,如果我只使用 AssemblyBuilderAccess.Run,​​这是不可能的;发生 BindingFailure 错误;无法找到程序集。我的印象是,运行选项将允许创建和使用,而无需实际存储程序集(或访问不同的构建器)。

(注意:下面的 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);
        }/
4

2 回答 2

2

这实际上现在记录在MSDN上:

GetType 仅适用于从磁盘加载的程序集。如果调用 GetType 来查找在使用 System.Reflection.Emit 服务定义的动态程序集中定义的类型,则可能会出现不一致的行为。行为取决于动态程序集是否是持久的,即使用 System.Reflection.Emit.AssemblyBuilderAccess 枚举的 RunAndSave 或 Save 访问模式创建。[...] 如果调用 GetType 时程序集尚未保存到磁盘,则该方法返回 null。GetType 不理解瞬态动态程序集;因此,调用 GetType 以检索瞬态动态程序集中的类型将返回 null。

然后文档继续说您可以订阅 AppDomain.AssemblyResolve 来解析动态程序集。

于 2012-10-22T13:35:44.120 回答
0

我不明白你想在那里做什么。两个问题: 1)第二行只是试图再次获得对 Type 的引用,这将与第一行的引用相同;这不是你得到的实例。2)IIRC,AssemblyQualifiedName 对于内存类型/程序集为空。

-Oisin

于 2009-10-06T15:19:07.430 回答