我正在用 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/