c# - 为什么 `Assembly` 和 `Module` 没有公开定义的构造函数?

标签 c# .net reflection

我正在用 C# 构建一个 .NET 程序集加载器以进行“实验”/了解有关 .NET 内部操作的更多信息。我通过派生如下类型实现了反射 API:

  • 运行时类型:类型
  • 运行时字段信息:字段信息
  • 运行时方法信息:方法信息
  • 运行时参数信息:参数信息
  • 运行时构造函数信息:构造函数信息
  • 运行时属性信息:属性信息

不幸的是,我遇到了麻烦,因为以下没有可公开访问的构造函数,所以我无法从它们派生:

  • Assembly(非密封 - AssemblyBuilder 是从它内部派生的)
  • 模块(非密封 - ModuleBuilder 是从它内部派生的)

我需要从 RuntimeType.get_Assembly 返回一些东西和 RuntimeType.get_Module .建议?发挥创意——我不得不这样做。 ;) 用于创建 RuntimeTypeHandle例如,一些不安全的指针转换可以完成工作,但这里并不那么容易。

顺便说一句:现在特别麻烦的是我正在尝试为加载的类型漂亮地打印 IL。对于构造泛型,Type.FullName属性包括通过 AssemblyQualifiedName 的通用参数属性(property),这又依赖于 Assembly属性(property)。

最佳答案

为什么你不能从他们那里得到?这两种类型(程序集和模块)都有一个 protected 构造函数,可用于您的派生类型。类型本身是公共(public)的,因此它比实际的说明符更不可见是没有问题的。

下面的代码可以正常编译

public class MyAssembly : System.Reflection.Assembly {
    public MyAssembly() : base() {}
}

至于为什么他们没有任何公共(public)构造函数。我对此没有任何直接了解,但很明显他们想强制人们从这些类中派生。考虑到它们没有抽象成员,这看起来确实很奇怪。我唯一能想到的是版本控制问题,但我现在没有想到背后的逻辑。

编辑

在我阅读 280Z28 的评论后,我检查了一下,是的,这是 .Net 4.0 的新功能。在 4.0 之前,Assembly 和 Module 的构造函数都是内部的,并且这两种类型都是具体的但不是密封的。因此,如果不对完全受信任的代码做一些坏事,就不可能在 4.0 之前进行推导。

关于c# - 为什么 `Assembly` 和 `Module` 没有公开定义的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1217470/

相关文章:

c# - 创建用于将元素添加到列表的流畅界面

java - 类中 getConstructors() 中的通用类型

c# - System.Reflection 性能

c# - 3(物理)层架构效率低下吗?

c# - 如何实现自定义 RazorViewEngine 以在非标准位置查找 View ?

c# - File.ReadLines() 和 File.ReadAllLines() 有什么区别?

.net - 表单背景颜色设置为淡色

.net - Jenkins Amazon EC2 代理云 - Windows 从属

c# - 哪种方法是了解传递给 C# 中泛型方法的参数类型的正确方法?

C# 反射 - 获取方法的整个参数列表(包括 "this"的参数)