从类型转换为 TypeBuilder
Convert from Type to TypeBuilder
我正在运行时创建一个 class,一些类型已经在 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;
欢迎提出任何建议,在此先感谢。
TypeBuilder 是 Type 的派生类型(通过中间 class 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());
}
}
some of the types are already created inside the ModuleBuilder and I would like to reuse them
你不能。一旦调用 TypeBuilder.CreateType
,类型就会冻结。即使您可以访问 TypeBuilder
,您也无法修改类型。
我正在运行时创建一个 class,一些类型已经在 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;
欢迎提出任何建议,在此先感谢。
TypeBuilder 是 Type 的派生类型(通过中间 class 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());
}
}
some of the types are already created inside the ModuleBuilder and I would like to reuse them
你不能。一旦调用 TypeBuilder.CreateType
,类型就会冻结。即使您可以访问 TypeBuilder
,您也无法修改类型。