c# - 什么情况下TypeBuilder.CreateType可以返回null?

标签 c# reflection reflection.emit

定义了TypeBuilder.CreateType()方法as nullable :

public Type? CreateType();

什么情况下可以返回null?文档没有说。

我可以深入研究源代码,但这会产生一个不可信的答案(尽管很有趣)。我错过了这个签名的书面解释吗?

最佳答案

站点间交叉发布啊嘿:https://github.com/dotnet/dotnet-api-docs/issues/7955


Under what conditions can TypeBuilder.CreateType() return null?

TL;DR:不存在以下情况:TypeBuilder.CreateType()将返回nullCreateType()正在被用户代码调用。您可以安全地添加一个 null-forgiving !CreateType()调用站点。


当前来源位于https://github.com/dotnet/runtime/blob/1a296c06fff8750b4658f6f7d901347e006744d0/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.cs#L1853

  • 快速浏览当前源代码表明 TypeBuilder.CreateType()只返回nullTypeBuilder是程序集隐藏的构建器 <Module>类(class)。
    • <Module>类是一种特殊类型,允许程序集/模块具有急切初始化的全局变量。
    • C# 语言本身不使用<Module> ,尽管其他语言也可以(例如 C++/CLI)。
    • 自 C# 9.0 起,you can now opt-in to adding <Module> members通过[ModuleInitializer]属性。
    • 当然,如果您使用 Reflection.Emit那么您将始终能够使用 ModuleBuilder回到 2001 年的 .NET 1.x。
  • <Module> -建筑TypeBuilder实例不能直接由用户代码实例化,因为它需要特定的 internal TypeBuilder()构造函数调用 - 相反,仅当您使用 ModuleBuilder 时才会调用此构造函数类型。
  • 唯一的情况是 TypeBuilder.CreateType()方法确实返回 null在里面void ModuleBuilder.CreateGlobalFunctions() ,这基本上确保了 class <Module> 在生成的动态程序集中定义。
  • 因此,虽然 Type? TypeBuilder.CreateType() 上的可为空注释的返回类型在技术上是正确的 ( the best kind of correct ),它之所以存在只是因为当前的 API 设计很差:它对两个单独的用例使用单一方法,而其中一种情况也存在internal -仅限。

关于c# - 什么情况下TypeBuilder.CreateType可以返回null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71804436/

相关文章:

c# - System.Windows.Forms.Keys 作为 SendKeys.Send 的参数

c# - 传递 HTML 页面字符串并使用 HtmlAgilityPack 进行抓取

php - Laravel 5 实现多个 Auth 驱动程序

c# - PropertyAttributes.HasDefault 和 PropertyBuilder.SetConstant 的含义

javascript - 如何访问由 BundleConfig 类创建的物理 Bundled 和 Minified js/css

c# - 实现聊天功能时出现违反多重约束的错误

java - 如何在运行时使用 LambdaMetafactory 访问动态类中的非静态方法

c# - 有没有办法通过反射获取类型的别名?

.net - 发出方法来覆盖非虚拟对象

c# - 为二维数组生成 IL