首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从类型转换为TypeBuilder

从类型转换为TypeBuilder
EN

Stack Overflow用户
提问于 2017-06-21 12:03:02
回答 2查看 716关注 0票数 0

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

是否有将类型转换为TypeBuilder的方法?

代码语言:javascript
复制
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;

欢迎任何建议,谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-27 08:15:10

TypeBuilder是一种派生类型(通过中间类TypeInfo)。

所以您可以将一个TypeBuilder转换为一个类型。但不是相反的。

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

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

代码语言:javascript
复制
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());
    }
}
票数 0
EN

Stack Overflow用户

发布于 2017-07-02 19:56:36

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

你不能。一旦你打电话给TypeBuilder.CreateType,类型就会冻结。即使可以访问TypeBuilder,也无法修改类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44675588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档