2011-01-19 72 views
1

如何检查Type对象是否为TypeBuilderInstantiation检查类型是否是TypeBuilder

基本上,我需要一种类型的方法。

如果是TypeBuilderInstantiation,我需要拨打TypeBuilder.GetMethod(...),而不仅仅是theType.GetMethod(...)(因为它会引发不支持的异常)。

我不能简单地检查该类型是否为TypeBuilder,因为TypeBuilderInstantiation直接继承自Type(不是TypeBuilder)。我不能直接检查TypeBuilderInstantiation,因为它是内部的。

+0

你如何获得该实例?如果没有创建,TypeBuilder.GetMethods也会抛出一个异常。你想做什么? – leppie 2011-01-19 14:14:57

回答

2

为什么不比较Type.Fullname与您对TypeBuilderInstantiation的期望?

这味道不好。你能详细说明你在做什么,你正在和一个内部班级混在一起吗?

+0

我认为TypeBuilderInstantiation的实例在调用CreateType之前将类型参数应用于TypeBuilder时会返回,但这是任何人猜测的结果。 – leppie 2011-01-19 14:20:46

0

我知道这是一个老问题,但我觉得批准的答案不是很有帮助。我从来不喜欢必须比较由框架提供的字符串的平等,因为如果它们在某个时候改变了应用程序的故障。

因此,创建了一些更复杂的系统在运行时构建自己的类型,让我在此线程中添加20美分。

TypeBuilderInstantiation是ALWAYS的通用类型的表示,即由至少一种TypeBuilder然后其他实例的TypeRuntimeTypeTypeBuilder和/或TypeBuilderInstantiation)的。这意味着所讨论类型的泛型类型定义是TypeBuilder或至少一个泛型参数是TypeBuilderGenericTypeParameterBuilder或它自己的TypeBuilderInstantiation。 (在GenericTypeParameterBuilder情况下,如果它是由泛型类型本身声明,它不计数。)

下面是一个例子如何获得的TypeBuilderInstantiation实例:

AssemblyName myAssemblyName = new AssemblyName("MyAssembly"); 
AssemblyBuilder myAssembly = AppDomain.CurrentDomain.DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess.Run); 
ModuleBuilder myModule = myAssembly.DefineDynamicModule("MyModule"); 
TypeBuilder myType = myModule.DefineType("MyType"); 
//myType (MyType) is TypeBuilder 
Type collectionType = typeof(Collection<>).MakeGenericType(myType); 
//collectionType (Collection<MyType>) is TypeBuilderInstantiation 

TypeBuilder myGenericType = myModule.DefineType("MyGenericType"); 
GenericTypeParameterBuilder myGenericParam = myGenericType.DefineGenericParameters("T")[0]; 
//myGenericType (MyGenericType<T>) is TypeBuilder 
Type genericType = myType.MakeGenericType(typeof(string)); 
//genericType (MyGenericType<string>) is TypeBuilderInstantiation 

TypeBuilder myOtherGenericType = myModule.DefineType("MyOtherGenericType"); 
GenericTypeParameterBuilder myOtherGenericParam = myOtherGenericType.DefineGenericParameters("S")[0]; 
Type otherGenericType = myType.MakeGenericType(myOtherGenericParam); 
//otherGenericType (MyGenericType<S>) is TypeBuilderInstantiation 

这里有一个漂亮的小实施,检查是否类型是否为TypeBuilderInstantiation

public static bool IsTypeBuilderInstantiation(Type type) 
{ 
    bool isTypeBuilderInstantiation = false; 
    if (type.IsGenericType && !(type is TypeBuilder)) 
    { 
     foreach (var genericTypeArg in type.GetGenericArguments()) 
     { 
      if (isTypeBuilderInstantiation = (
       genericTypeArg is TypeBuilder || 
       genericTypeArg is GenericTypeParameterBuilder || 
       IsTypeBuilderInstantiation(genericTypeArg))) 
       break; 
     } 
     isTypeBuilderInstantiation |= type.GetGenericTypeDefinition() is TypeBuilder; 
    } 
    return isTypeBuilderInstantiation; 
}