列出运行时从开放泛型类型创建的封闭类型

2024-05-15

当我列出当前 AppDomain 中的所有类型时,我会看到带有通用占位符的通用类型。但是,如果我使用类型实例化泛型类型,然后列出 appDomain 中的所有类型,则我看不到新创建的封闭类型。

在下面的示例中,输出仅为:

Foo`1[T]

我正在寻找封闭类型:

Foo`1[System.Int32]

有没有办法查看运行时根据我的开放泛型类型为我创建的封闭类型?

class Foo<T>
{
}

class Program
{
    static void Main(string[] args)
    {
        var tmp = new Foo<int>();
        ListTypes();
    }

    private static void ListTypes()
    {
        var types = from assembly in AppDomain.CurrentDomain.GetAssemblies()
                        from type in assembly.GetTypes()
                        where type.Name.Contains("Foo")
                        select type;

        foreach (var type in types)
            Console.WriteLine(type.ToString());
    }
}

我还尝试通过泛型参数查找所有类型,希望能发现封闭类型。

class Foo<T>
{
}

class Bar
{
}

class Program
{
    static void Main(string[] args)
    {
        var tmp = new Foo<Bar>();
        ListTypes();
    }

    private static void ListTypes()
    {
        var types = from assembly in AppDomain.CurrentDomain.GetAssemblies()
                        from type in assembly.GetTypes()
                        where type.IsGenericType
                        && type.GetGenericArguments().Contains(typeof(Bar))
                        select type;

        foreach (var type in types)
            Console.WriteLine(type.ToString());
    }
}

这只是为了满足我的好奇心。


据我所知,在这种情况下Foo<T>是一个开放的未绑定泛型类型,因此在运行时 CLR 将使用它作为蓝图/骨架来构造和关闭具有指定类型参数类型的泛型类型(Foo<int>, Foo<object>, ETC。)。所以基本上Foo<int>是一个运行时构造的实现Foo<T>骨骼。

现在,在运行时您可以获得以下类型Foo<int>要么通过使用typeof(Foo<int>) or typeof(Foo<>).MakeGenericType(new[] { typeof(int) })这不一样Type这样做是没有意义的。但仔细观察你会发现两者typeof(Foo<T>) and typeof(Foo<int>)共享相同的元数据令牌和 GUID。

另一个有趣的事情是typeof(Foo<int>).Assembly将是您所期望的,但正如您已经注意到的那样,您无法从程序集中获得该类型。

那是因为Foo<int>未在程序集中定义(您可以使用 Reflector/ILSpy 检查程序集元数据)。在运行时,CLR 将创建(“构造”)一个专门的(“封闭的”)版本Foo<T> for Foo<int>(因此 - 构造无界开放泛型类型定义的封闭类型)并“给”它一个Type。因此,除非 CLR 以某种方式直接公开它在运行时生成的封闭泛型类型列表,否则您就不走运了。

这里还有一个片段可以证实我所说的:

即使每次构造一个泛型类型,例如 Node

和 Node 一样,有自己独特的类型标识,CLR 能够 在类型之间重用大部分实际的 JIT 编译代码 实例化。这大大减少了代码膨胀并且是可能的 因为泛型类型的各种实例化都在 运行。在编译时存在的所有构造类型都是 类型参考。当程序集 A 和 B 都引用泛型类型时 在第三个程序集中定义,它们的构造类型在 运行。这意味着,除了共享 CLR 类型标识之外 (在适当的情况下),还可以从程序集 A 和 B 中键入实例 共享运行时资源,例如本机代码和扩展元数据。

http://msdn.microsoft.com/en-us/magazine/cc163683.aspx http://msdn.microsoft.com/en-us/magazine/cc163683.aspx

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

列出运行时从开放泛型类型创建的封闭类型 的相关文章

  • 这可以用 Moq 来嘲笑吗?

    我正在努力模拟一些外部依赖项 并且在一个第三方类中遇到了麻烦 该类在其构造函数中接收另一个第三方类的实例 希望 SO 社区能给我一些指导 我想创建一个模拟实例SomeRelatedLibraryClass它的构造函数接受一个模拟实例Some
  • 从 SortedList 或 SortedDictionary 获取第 i 个值

    我有一个排序的对象集合 它可以是 SortedList 或 SortedDictionary 我将主要使用它来阅读 因此增加性能并不那么重要 我怎样才能得到第i个值 所以例如当我的集合中有数字 1 2 3 4 5 并且我想要中位数 本例中为
  • .NET 的 C 代码解析器

    有谁知道 NET 的 C 解析器库吗 我打算将 C 代码解析为某种形式的对象图 这样我就可以将其转换为不同的语言 ANTLR 可以做你想做的事 它有一个 C 预处理器和 ANSI C 语法 https github com antlr gr
  • 未分配给变量的类实例是否会过早被垃圾回收?

    我什至不知道我的问题是否有意义 这只是我不明白的事情 并且在我的脑海中旋转了一段时间 考虑有以下课程 public class MyClass private int myVar public void DoSomething Do som
  • 执行鼠标单击而不移动光标

    除了移动光标之外 我找不到任何解决方案Cursor类 点击mouse event然后将光标移动到原来的位置 我正在玩SendInput现在可以运行 但仍然没有机会找到好的解决方案 有什么建议吗 您应该使用 Win32 API 使用 user
  • 用户模式 ​​.NET 设置存储在哪里?

    我想知道 NET 中 settings 文件背后的魔力是什么 假设您创建了一个在此示例中称为的程序集SettingsHolder 您创建一个公共的设置类 其中在用户模式下有一个字符串 然后进行编译 现在 您在 MyApp 中引用您的程序集
  • Task.Factory.StartNew 或 Parallel.ForEach 对于许多长时间运行的任务? [复制]

    这个问题在这里已经有答案了 可能的重复 Parallel ForEach 与 Task Factory StartNew https stackoverflow com questions 5009181 parallel foreach
  • 如何获取 ASP.NET MVC 中当前的虚拟路径?

    如何从 ASP NET MVC 视图中获取当前路径 URL 如果没有办法将其获取到视图中 那么如何将其获取到控制器中以便将其传递到视图呢 EDIT 我不需要 url 的协议和主机部分 这将为您返回视图中的 url
  • 框架中有通用的交换方法吗?

    框架中是否存在这样的方法 public static void Swap
  • 如何获取运行或段落的高度

    我找到了Run or Paragraph in FlowDocument现在我需要知道HEIGHT of it i e while navigator CompareTo flowDocViewer Document ContentEnd
  • 如何使用 Linq 将实体表与交叉引用表连接起来

    首先我要说的是 我对 Linq 比较陌生 但我似乎很快就掌握了其中的大部分内容 但这个问题却难倒了我 我找了又找都没有结果 我使用代码优先并创建了 2 个模型 项目 和 关键字 他们之间存在多对多的关系 我的实体模型如下所示 public
  • 如何在 C# 中从这个分层父子结构中查找任何项目

    如何从列表中查找任何项目 因为它是动态的 它可能位于列表的任何位置的父项或子项中 并且当子项计数为0时需要停止查找 下面是列表的模型和分层父子结构示例 例子 父级 gt 子级 gt 子级 gt 子级或父级 gt 子级 gt 子级 gt 子级
  • 如何使用 .net 2.0 中的 WebBrowser 控件检查 ajax 更新?

    我有一个网页正在使用 WebBrowser 控件在 winform 应用程序中显示 我需要在网页中的 HTML 发生变化时执行一个事件 但是 我找不到通过 Ajax 更新页面时触发的事件 DocumentComplete FileDownl
  • 用户如何在winforms运行时调整控件大小

    假设我有一个图片框 现在我想要的是用户应该能够随意调整图片框的大小 但是我不知道如何开始做这件事 我搜索过互联网 但信息很少 有人至少可以指导我从哪里开始吗 这很容易做到 Windows 中的每个窗口都具有与生俱来的可调整大小的能力 它刚刚
  • C# 为所有对象订阅相同的事件处理程序是线程安全的吗

    我的项目中有一种情况 我连接到多个服务器并监听事件 每当从服务器接收到事件时 Handler 就应该将该事件添加到公共队列中进行处理 所有连接都应将接收到的事件添加到队列中 foreach var item in collection Co
  • 实现“LazyProperty”类 - 这是一个好主意吗?

    我经常发现自己编写的属性是惰性评估的 就像是 if backingField null backingField SomeOperation return backingField 代码不多 但如果您有很多属性 它确实会重复很多次 我正在考
  • WPF DataGrid 排序后滚动到顶部

    我有一个使用数据网格的 Net 4 0 WPF 应用程序 目前 按列排序后 网格的滚动位置保持在排序前的位置 对于此应用程序 我需要在任何排序后滚动到网格顶部 我尝试过像这样处理排序事件 Private Sub myDataGrid Sor
  • C#/.NET 3.5:转换扩展通用列表的对象

    我通过带有返回接口类型的方法的外观公开 API 并且在 C NET 3 5 中遇到了通用列表和继承的问题 我有两个接口 IMyList 实现 IList IMyItem 和三个类 MyList 实现 IMyList 扩展 List MyOt
  • 将 KeyDown 事件传递给其他控件

    我正在编写一个 C WinForms 应用程序 NET 4 0 我有一个WinFormsControl on a Form 用户开始使用键盘输入内容后 另一个Control出现 那Control是某种文本输入 我想将用户输入发送到该Cont
  • 假装 .NET 字符串是值类型

    在 NET 中 字符串是不可变的 并且是引用类型变量 这通常会让新的 NET 开发人员感到惊讶 因为他们的行为可能会将它们误认为是值类型对象 然而 除了使用实践StringBuilder对于长连接 尤其是 在循环中 在实践中是否有任何理由需

随机推荐

  • 这个奇怪的泽西警告是什么意思?

    这个警告在 Jersey 1 4 中意味着什么 WARNING A sub resource method public final java lang String com XXX render with URI template is
  • 将数据集导出到一个 Excel 文件的多个 Excel 工作表中

    我需要在同一工作簿的两个 Excel 工作表中导出两个数据集的值 我的查询是这样的 数据集一 DataSet ds1 new DataSet SqlCommand commandOpen new SqlCommand storedproc1
  • 为什么不使用均方误差来解决分类问题?

    我正在尝试使用 LSTM 解决一个简单的二元分类问题 我正在尝试找出网络的正确损失函数 问题是 当我使用二元交叉熵作为损失函数时 与使用均方误差 MSE 函数相比 训练和测试的损失值相对较高 经过研究 我发现二元交叉熵应该用于分类问题 MS
  • inno setup bmp图像出现在单个页面上

    我希望 bmp 图像出现在单个页面 selectadditionaltasks 上 但它出现在所有页面上 我究竟做错了什么 procedure LogoOnClick Sender TObject var ResCode Integer b
  • Linux 桌面快捷方式和安装图标

    我需要添加什么到我的 spec文件来创建桌面快捷方式并在安装过程中为快捷方式分配一个图标 rpm 如果需要脚本 一个示例将非常有帮助 您在 Linux 下使用 desktop 文件作为图标 图标放置的位置取决于您使用的发行版和桌面环境 由于
  • 在 Angular 中获取当前路由路径名称的最简单方法是什么?

    我正在寻找一种获取当前路线的路径名称的好方法 这是我能找到的最简单的 this route snapshot firstChild url 0 path 有没有更好的办法 谢谢 谢谢大家的回答 这是我发现我必须做的 router event
  • 无法删除数据库 mysql:错误 3664 (HY000)

    我的应用程序中有一个名为X Files 我想要drop它 但每当我运行命令时drop database X Files我收到以下错误 mysql gt drop database X Files ERROR 3664 HY000 Faile
  • 由于继承抽象类而禁用设计器?

    我有一个项目的解决方案 那个项目中有 40 或 50 种形式 我制作了 4 个基本形式 所有其他形式都可以继承 所有 4 个基本表单都继承 System Windows Forms Form 几乎 90 的形式继承了前 2 个基本形式之一
  • 具有继承类型的 Aux 模式推理失败

    我有一个复杂的玩具算法 我希望纯粹在类型级别上表示 根据饮食要求选择当天菜肴的修改 对卷积表示歉意 但我认为我们需要每一层才能达到我想要使用的最终界面 我的代码有一个问题 如果我们表达一个类型约束Aux 模式生成的类型基于另一个泛型类型 它
  • 为什么我的 Pygame 窗口在为对象设置动画时会闪烁?

    所以我的 pygame 窗口不会停止闪烁 我知道只要one项目在snake snakearray 不会闪烁 class for the array class snake snakearray ScreenConfigs width 2 S
  • 如何通过start-stop-daemon正常关闭Spring Boot应用程序[重复]

    这个问题在这里已经有答案了 我们有一个多线程 Spring Boot 应用程序 它作为守护进程在 Linux 机器上运行 当我尝试像这样通过启动停止守护进程停止应用程序时 start stop daemon stop quiet retry
  • py2neo 引发完成(自我)错误

    使用 py2neo 时 我在尝试附加事务时收到以下错误 statement MERGE a Person name actorName n MERGE b Series title actorsFields 3 year actorsFie
  • 可以在 pystan 或 pymc3 中使用样本权重吗?

    如果我观察到的数据集具有权重 例如跟踪多重性 是否可以将其提供给 pystan 或 pymc3 类似于函数签名 http mc stan org rstanarm reference stan glm html http mc stan o
  • 在 Firefox Add-on SDK 扩展中的“onInstalled”上执行脚本

    我对 Mozilla 扩展开发非常陌生 即使我刚刚知道扩展和附加开发是不同的 我对我在 MDN Mozilla 开发者网络 上看到的内容非常困惑 我想在安装我的附加组件后立即执行脚本 content script js 以便用户不需要重新启
  • 连接到远程 DB2 时出现“操作超时。ERRORCODE=-4499,SQLSTATE=08001”

    我正在尝试使用 IBM Type 4 JDBC 驱动程序连接到远程 DB2 这是我的配置 Server Windows 7 专业版 DB2 LUW V10 5 DB2 SVCENAME 50000 TCP IP 进行通信 Client 操作
  • Hibernate 在使用序列时生成负 id 值

    我有一个具有以下定义的类 Id SequenceGenerator name SEQ ACE WORKERS QUEUE STATS ID sequenceName SEQ ACE WORKERS QUEUE STATS ID alloca
  • 重写规则无法正确过滤推荐垃圾邮件(不再)

    我已将以下重写规则添加到我的 web config 中 它运作良好 阻止了所有提到的推荐垃圾邮件网站 然而今天我突然发现social buttons com出现在我的谷歌分析中 我在下面定义的规则怎么可能做到这一点
  • Flutter 中的 Android 许可证

    4 天前一切正常 我进行了更新 许可证停止通过 我到目前为止所做的事情 检查了工具过时的东西 gt 不起作用 flutter doctor android licenses gt 不起作用 sdkmanager licenses gt 不起
  • 如何从 javascript 终止会话

    很多时候我们使用会话变量来存储页面中的数据 当用户从一个页面跳转到另一个页面时 我需要一种方法来终止 JavaScript 的会话 是否可以 如果是的话请指导我 提前致谢 您需要告诉服务器终止会话变量 从 javascript 执行此操作的
  • 列出运行时从开放泛型类型创建的封闭类型

    当我列出当前 AppDomain 中的所有类型时 我会看到带有通用占位符的通用类型 但是 如果我使用类型实例化泛型类型 然后列出 appDomain 中的所有类型 则我看不到新创建的封闭类型 在下面的示例中 输出仅为 Foo 1 T 我正在