2012-02-20 69 views
18

我正在查看Type的元數據,並注意到一個成員被保護,這讓我想知道可能從它得到什麼,這讓我意識到我可以編寫一個從它派生出來的類,所有這些讓我想知道我是什麼可以做到這一點(如果有的話)。爲什麼不是類封閉,我該怎麼辦?

沒有編譯器錯誤從以下幾點:

class MyType : Type 
{ 
    // Implemented abstract members here. 
} 
+1

非常有趣的問題!但是請刪除不必要的代碼塊,它不會真正爲您的問題增加更多的價值,而不僅僅是'class MyType:Type {...}'。 – stakx 2012-02-20 19:33:15

+0

我會讓編輯priv的人同意你這樣做,我認爲它很無奈看到派生類必須實現什麼才能編譯... – 2012-02-20 19:36:36

回答

11

大問題。我只有部分答案。目前有4個派生於Type的類。您可以在MSDN上找到類型層次結構。

System.Object 
    System.Reflection.MemberInfo 
    System.Type 
     System.Reflection.Emit.EnumBuilder 
     System.Reflection.Emit.GenericTypeParameterBuilder 
     System.Reflection.Emit.TypeBuilder 
     System.Reflection.TypeDelegator 

看起來這些類型基本上用於封裝一些「實例構建」邏輯。但我還沒有探索過這些代碼。

編輯

哦,哇...這很有趣。代碼示例似乎不僅創建了實例的類型,還自己創建了。因此,其中一些類正在創建CLR類型,並將它們保存爲實際的程序集。這很酷。

再次編輯

一些大狗都表示,有超過四類我上面列出的更多。我用反射 ReSharper的發現派生類型,發現這些(缺仍有可能是類型):

System.Type 
    System.RuntimeType 
    System.ReflectionOnlyType 
    System.Reflection.Emit.EnumBuilder 
    System.Reflection.Emit.GenericTypeParameterBuilder 
    System.Reflection.Emit.SymbolType 
    System.Reflection.Emit.TypeBuilder 
    System.Reflection.Emit.TypeBuilderInstantiation 
    System.Reflection.TypeDelegator 

編輯一旦更多

爲@MarcGravell說,真的沒有理由你會想從這些派生出一個類。但是,您可以在您自己的類中使用它們來封裝自己的邏輯。

+1

只是一個猜測,但也許當你「預編譯」一個常規表達,這就是幕後發生的事情 – 2012-02-20 19:42:33

+1

是的,元編程在.NET中非常強大;我有一些代碼可以完成那些非常瘋狂的事情 – 2012-02-20 19:46:56

7

是的,不要繼承; p有類似RuntimeType等 - Type是你應該經常使用的抽象。如果您想在運行時動態表示類型,則有兩個主要選項;

  • 在4.0,dynamic(通過實施IDynamicMetaObjectProvider
  • 在此之前,TypeDescriptor(通過實施ICustomTypeDescriptor或提供TypeDescriptionProvider,以及可能的TypeConverter

如果你想要做的元編程(在運行時創建實際的新類型,而不是欺騙它),還有TypeBuilder

+0

是否有任何理由繼承Type? MSDN上的代碼示例顯示了一些用於封裝某些類創建邏輯(如EnumBuilder)的派生類型。使用Type或TypeBuilder作爲生成其他類型或程序集的基類是否合乎邏輯? – 2012-02-20 19:39:00

+0

@ChristopherHarris「builder」版本實際上並不可用*;他們只是元編程。只有當'CreateType()'被用來創建一個* actual *類型(僅僅被稱爲'Type')時,它們纔可用 – 2012-02-20 19:40:10

+0

對,我現在看到了。創建更多「構建器」版本是否合適(假設),只使用現有的構建器版本? – 2012-02-20 19:42:43

7

Type是uns因爲它實際上被設計爲從運行時繼承。有許多這樣的例子在BCL

  • EnumBuilder
  • RuntimeType
  • TypeBuilder

的最有趣的,恕我直言,是RuntimeType這是多麼的好廣大Type實例在一個正在運行的系統中實現。大多數撥打o.GetType()的電話實際上會返回一個RuntimeType實例。