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

我正在用C#构建一个.NET程序集加载器,用于“实验”/了解有关.NET内部操作的更多信息。 我通过派生类型来实现reflectionAPI:

  • RuntimeType:类型
  • RuntimeFieldInfo:FieldInfo
  • RuntimeMethodInfo:MethodInfo
  • RuntimeParameterInfo:ParameterInfo
  • RuntimeConstructorInfo:ConstructorInfo
  • RuntimePropertyInfo:PropertyInfo

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

  • assembly(未密封 – AssemblyBuilder内部派生自它)
  • 模块(未密封 – ModuleBuilder内部派生自它)

我需要从RuntimeType.get_AssemblyRuntimeType.get_Module返回一些东西。 建议? 发挥创意 – 我必须这样做。 ;)对于创建RuntimeTypeHandle实例,一些不安全的指针转换可以完成工作,但这并不容易。

暂且不说:现在特别麻烦的是我正在尝试为负载类型打印IL。 对于构造的generics, Type.FullName属性通过AssemblyQualifiedName属性包含generics参数,而AssemblyQualifiedName属性又依赖于Assembly属性。

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

以下代码编译得很好

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

至于为什么他们没有任何公共建设者。 我对此没有任何直接的了解,但似乎很明显他们想强迫人们从这些课程中获得。 考虑到他们没有抽象成员,这似乎很奇怪。 我唯一能想到的是版本问题,但现在没有任何逻辑可以跳到我的脑海。

编辑

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