【问题标题】:Convert from Type to TypeBuilder从 Type 转换为 TypeBuilder
【发布时间】:2017-11-24 07:51:47
【问题描述】:

我正在运行时创建一个类,其中一些类型已经在 ModuleBuilder 中创建,我想重用它们,但我只有 Type 而没有 TypeBuilder(这是我需要更改的它)

有没有办法从 Type 转换为 TypeBuilder?

Type moduleType = ModuleBuilder.GetType(inXmlTemplateProperty.PropertyName);
        if (moduleType == null)
        {
            TypeBuilder newClass = ModuleBuilder.DefineType(inXmlTemplateProperty.PropertyName,
                                                            TypeAttributes.Public | TypeAttributes.Class | TypeAttributes.Serializable);

            newClass.SetClassAttributes(inXmlTemplateProperty);

            return newClass;
        }

        return (TypeBuilder)moduleType;

欢迎任何建议,在此先感谢。

【问题讨论】:

    标签: c# types reflection.emit typebuilder


    【解决方案1】:

    TypeBuilder 是 Type 的派生类型(通过中间类 TypeInfo)。

    因此,您可以将 TypeBuilder 转换为 Type。但不是反过来。

    您需要使用最高通用抽象级别(类型)。

    不要将 moduleType 转换为 TypeBuilder。 稍后,您将能够使用以下代码检查该类型是否已创建:

    class Program
    {
        private static Type GetSomeTypePending(string typeName)
        {
            AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("toto.dll"), AssemblyBuilderAccess.RunAndSave);
            ModuleBuilder mb = ab.DefineDynamicModule("toto.dll");
            TypeBuilder tb = mb.DefineType(typeName);
            return tb;
        }
    
        private static Type GetSomeTypeCreated(string typeName)
        {
            AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("toto.dll"), AssemblyBuilderAccess.RunAndSave);
            ModuleBuilder mb = ab.DefineDynamicModule("toto.dll");
            TypeBuilder tb = mb.DefineType(typeName);
            tb.CreateType(); // do not return the created type, 
            return tb;       // return the typebuilder
        }
    
        static void Main(string[] args)
        {
            Type foo = GetSomeTypePending("tutu");
            Type foo2 = GetSomeTypeCreated("tutu");
            if (IsPendingTypeBuilder(foo))
            {
                Console.WriteLine("foo not yet created");
            }
            else
            {
                Console.WriteLine("foo created");
            }
            if (IsPendingTypeBuilder(foo2))
            {
                Console.WriteLine("foo2 not yet created");
            }
            else
            {
                Console.WriteLine("foo2 created");
            }
        }
    
        private static bool IsPendingTypeBuilder(Type foo)
        {
            return (foo is TypeBuilder) && !((foo as TypeBuilder).IsCreated());
        }
    }
    

    【讨论】:

    • 您好,感谢您的回答,这是我的第一次尝试,但遗憾的是抛出了 InvalidCastException。
    【解决方案2】:

    ModuleBuilder 中已经创建了一些类型,我想重用它们

    你不能。只要您致电TypeBuilder.CreateType,该类型就会冻结。即使您可以访问TypeBuilder,您也无法修改类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-24
      • 1970-01-01
      • 2020-07-05
      • 2011-07-25
      • 1970-01-01
      • 2020-12-27
      相关资源
      最近更新 更多