如何检查Type对象是否为TypeBuilderInstantiation
?
基本上,我需要一个关闭Type的方法。
如果是TypeBuilderInstantiation
,我需要调用TypeBuilder.GetMethod(...)
,而不仅仅是theType.GetMethod(...)
(因为它会抛出一个不受支持的异常)。
我不能简单地检查theType是否为TypeBuilder
,因为TypeBuilderInstantiation
直接从Type(不是TypeBuilder
)继承。我无法直接查看TypeBuilderInstantiation
,因为它是内部的。
答案 0 :(得分:2)
为什么不将Type.Fullname
与TypeBuilderInstantiation
期待的内容进行比较?
这闻起来很糟糕。你能详细说明你正在做什么吗?你在内部课堂上乱搞?
答案 1 :(得分:1)
我知道这是一个老问题,但我觉得批准的答案不是很有帮助。我从来不喜欢比较框架提供的字符串的相等性,因为如果它们在某些时候发生变化,那么应用程序就会崩溃。
因此,创建了一些在运行时构建自己类型的更复杂的系统,让我在这个帖子中加上我的二十美分。
TypeBuilderInstantiation
始终是泛型类型的表示形式,由至少一个TypeBuilder
和Type
RuntimeType
TypeBuilder
,TypeBuilderInstantiation
的其他实例组成}和/或TypeBuilder
)。这意味着相关类型的泛型类型定义是TypeBuilder
或至少一个泛型参数是GenericTypeParameterBuilder
,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;
}
。
{{1}}