首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查类型是否为TypeBuilder

检查类型是否为TypeBuilder
EN

Stack Overflow用户
提问于 2011-01-19 22:11:41
回答 2查看 175关注 0票数 3

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

基本上,我需要一个脱离Type的方法。

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-19 22:19:12

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

闻起来很难闻。你能详细说明你正在做什么,你是在摆弄一个内部类吗?

票数 2
EN

Stack Overflow用户

发布于 2015-02-06 00:53:18

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

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

TypeBuilderInstantiation始终是泛型类型的表示形式,它至少包含一个TypeBuilder,然后是Type的其他实例(RuntimeTypeTypeBuilder和/或TypeBuilderInstantiation)。这意味着所讨论的类型的泛型类型定义是TypeBuilder,或者至少有一个泛型参数是TypeBuilderGenericTypeParameterBuilder或其本身是TypeBuilderInstantiation。(对于GenericTypeParameterBuilder,如果它是由泛型类型本身声明的,则它不算数。)

下面是如何获取TypeBuilderInstantiation实例的示例

代码语言:javascript
复制
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

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4736191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档