2009-08-01 42 views
2

我正在C#中爲「實驗」構建一個.NET程序集加載器/學習更多關於.NET內部操作的知識。我已經通過派生類型等實現的反射API:爲什麼`Assembly`和`Module`沒有公開定義的構造函數?

  • RuntimeType:類型
  • RuntimeFieldInfo:字段信息
  • RuntimeMethodInfo:MethodInfo的
  • RuntimeParameterInfo:的ParameterInfo
  • RuntimeConstructorInfo:ConstructorInfo
  • RuntimePropertyInfo:物業信息

不幸的是我有麻煩了,因爲下面有沒有可公開訪問的構造函數,所以我不能從中獲得:

  • 大會(非密封 - AssemblyBuilder內部從它派生)
  • 模塊(未密封 - ModuleBuilder是內部派生而來的)

我需要一些東西從RuntimeType.get_AssemblyRuntimeType.get_Module返回。建議?發揮創意 - 我不得不。 ;)爲了創建RuntimeTypeHandle實例,一些不安全的指針轉換可以完成任務,但在這裏並不容易。

順便說一句:現在特別的麻煩是我試圖漂亮地打印加載類型的IL。對於構建的仿製藥,Type.FullName屬性包含通過AssemblyQualifiedName屬性的通用參數,該屬性依次依賴於Assembly屬性。

回答

1

你爲什麼不能從它們派生出來?這兩種類型(Assembly和Module)都有一個受保護的構造函數,可用於派生類型。這些類型本身是公開的,所以不存在與實際指定者不可見的問題。

下面的代碼編譯就好

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

至於爲什麼他們沒有任何公共構造函數。我對此沒有任何直接瞭解,但似乎很清楚他們想要迫使人們從這些課程中派生出來。考慮到他們沒有抽象成員,這看起來很奇怪。我能想到的唯一的事情是版本的問題,但背後沒有邏輯,現在是跳躍在我的腦海。

編輯

後,我看了280Z28的評論我檢查,是的,這是新的.NET 4.0。在4.0之前,Assembly和Module的構造函數都是內部的,並且這兩種類型都是具體的但不是密封的。所以在4.0之前的推導是不可能的,不要用完全可信的代碼來做一些壞事。

+0

如果是這樣的話,那麼它的無論是新的.NET 4或.NET 2. – 2009-08-01 21:11:35

相關問題