检查Type是TypeBuilder

时间:2011-01-19 14:11:41

标签: .net reflection.emit

如何检查Type对象是否为TypeBuilderInstantiation

基本上,我需要一个关闭Type的方法。

如果是TypeBuilderInstantiation,我需要调用TypeBuilder.GetMethod(...),而不仅仅是theType.GetMethod(...)(因为它会抛出一个不受支持的异常)。

我不能简单地检查theType是否为TypeBuilder,因为TypeBuilderInstantiation直接从Type(不是TypeBuilder)继承。我无法直接查看TypeBuilderInstantiation,因为它是内部的。

2 个答案:

答案 0 :(得分:2)

为什么不将Type.FullnameTypeBuilderInstantiation期待的内容进行比较?

这闻起来很糟糕。你能详细说明你正在做什么吗?你在内部课堂上乱搞?

答案 1 :(得分:1)

我知道这是一个老问题,但我觉得批准的答案不是很有帮助。我从来不喜欢比较框架提供的字符串的相等性,因为如果它们在某些时候发生变化,那么应用程序就会崩溃。

因此,创建了一些在运行时构建自己类型的更复杂的系统,让我在这个帖子中加上我的二十美分。

TypeBuilderInstantiation始终是泛型类型的表示形式,由至少一个TypeBuilderType RuntimeType TypeBuilderTypeBuilderInstantiation的其他实例组成}和/或TypeBuilder)。这意味着相关类型的泛型类型定义是TypeBuilder或至少一个泛型参数是GenericTypeParameterBuilderTypeBuilderInstantiation或本身是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; }

{{1}}