【发布时间】:2017-04-06 00:21:30
【问题描述】:
我正在使用TypeBuilder 创建类型。然后将这些类型用作泛型类中的参数。我想做的是根据其名称创建Type。泛型参数是动态的这一事实似乎是一个障碍。
static public class DynamicTypeTest
{
public class Generic<T> { }
static public void Test()
{
Type dynamicType = createDynamicType();
Type genericType = typeof(Generic<>);
// Generic<DynamicType>
Type genericDynamicType = genericType.MakeGenericType(new Type[]{dynamicType});
Debug.Assert(TypeFromName(genericDynamicType.FullName) == genericDynamicType); // fail
Debug.Assert(TypeFromName(genericDynamicType.AssemblyQualifiedName) == genericDynamicType); // fail
Debug.Assert(TypeFromName(genericDynamicType.Name) == genericDynamicType); // fail
// Generic<int>
Type genericIntType = genericType.MakeGenericType(new Type[] { typeof(int) });
Debug.Assert(TypeFromName(genericIntType.FullName) == genericIntType); // This succeeds. Replacing 'int' with a Type defined in another project also works
}
// This is the essence of what I want to do
static private Type TypeFromName(string name)
{
return Assembly.GetExecutingAssembly().GetType(name);
}
static private Type createDynamicType()
{
AssemblyName assemblyName = new AssemblyName("DynamicAssembly");
AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("DynamicModule");
TypeAttributes typeAttributes = TypeAttributes.Public | TypeAttributes.Class | TypeAttributes.AutoClass | TypeAttributes.AnsiClass;
TypeBuilder typeBuilder = moduleBuilder.DefineType("DynamicType", typeAttributes, typeof(System.Object));
return typeBuilder.CreateType();
}
}
显然我知道如何从 MakeGenericType 创建 Type,但在我正在使用的现实生活场景中,我不想(或不能)修改类型名称,以便我可以分别创建类型并将它们拼凑在一起。
如何从string 名称重新创建这种Type?
【问题讨论】:
-
好吧,您生成的类型存在于您称为
DynamicAssembly的程序集中,对吗?那么为什么要在 executing 程序集中寻找它呢? -
Generic<>存在于执行程序集中。还从执行装配工作中检索Generic<int>。 (从DynamicAssembly检索Generic<DynaminType>不起作用 - 我确实尝试过。) -
从
DynamicAssembly中检索DynamicType和从ExecutingAssembly中检索Generic<>(或者如果您静态知道typeof,则仅使用typeof)。然后使用MakeGenericType将它们放在一起。 -
我不想检索
DynamicType。我正在尝试检索Generic<DynamicType>。看看名为genericDynamicType的变量。
标签: c# types .net-assembly typebuilder