C# 从Type转换为TypeBuilder

C# 从Type转换为TypeBuilder,c#,types,reflection.emit,typebuilder,C#,Types,Reflection.emit,Typebuilder,我正在运行时创建一个类,其中一些类型已经在ModuleBuilder中创建,我希望重用它们,但我只有类型,没有TypeBuilder(这是我更改它所需要的) 有没有一种从类型转换到类型生成器的方法 Type moduleType = ModuleBuilder.GetType(inXmlTemplateProperty.PropertyName); if (moduleType == null) { TypeBuilder newClass

我正在运行时创建一个类,其中一些类型已经在ModuleBuilder中创建,我希望重用它们,但我只有类型,没有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;

欢迎提出任何建议,提前感谢。

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

因此,您可以将类型生成器强制转换为类型。但不是相反

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

不要将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());
    }
}
有些类型已经在ModuleBuilder中创建,我想重用它们


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

您好,谢谢您的回答,这是我第一次尝试,但遗憾的是,这引发了一个无效的异常。