我正在查看Type的元數據,並注意到一個成員被保護,這讓我想知道可能從它得到什麼,這讓我意識到我可以編寫一個從它派生出來的類,所有這些讓我想知道我是什麼可以做到這一點(如果有的話)。爲什麼不是類封閉,我該怎麼辦?
沒有編譯器錯誤從以下幾點:
class MyType : Type
{
// Implemented abstract members here.
}
我正在查看Type的元數據,並注意到一個成員被保護,這讓我想知道可能從它得到什麼,這讓我意識到我可以編寫一個從它派生出來的類,所有這些讓我想知道我是什麼可以做到這一點(如果有的話)。爲什麼不是類封閉,我該怎麼辦?
沒有編譯器錯誤從以下幾點:
class MyType : Type
{
// Implemented abstract members here.
}
大問題。我只有部分答案。目前有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說,真的沒有理由你會想從這些派生出一個類。但是,您可以在您自己的類中使用它們來封裝自己的邏輯。
只是一個猜測,但也許當你「預編譯」一個常規表達,這就是幕後發生的事情 – 2012-02-20 19:42:33
是的,元編程在.NET中非常強大;我有一些代碼可以完成那些非常瘋狂的事情 – 2012-02-20 19:46:56
是的,不要繼承; p有類似RuntimeType
等 - Type
是你應該經常使用的抽象。如果您想在運行時動態表示類型,則有兩個主要選項;
dynamic
(通過實施IDynamicMetaObjectProvider
)TypeDescriptor
(通過實施ICustomTypeDescriptor
或提供TypeDescriptionProvider
,以及可能的TypeConverter
)如果你想要做的元編程(在運行時創建實際的新類型,而不是欺騙它),還有TypeBuilder
是否有任何理由繼承Type? MSDN上的代碼示例顯示了一些用於封裝某些類創建邏輯(如EnumBuilder)的派生類型。使用Type或TypeBuilder作爲生成其他類型或程序集的基類是否合乎邏輯? – 2012-02-20 19:39:00
@ChristopherHarris「builder」版本實際上並不可用*;他們只是元編程。只有當'CreateType()'被用來創建一個* actual *類型(僅僅被稱爲'Type')時,它們纔可用 – 2012-02-20 19:40:10
對,我現在看到了。創建更多「構建器」版本是否合適(假設),只使用現有的構建器版本? – 2012-02-20 19:42:43
Type
是uns因爲它實際上被設計爲從運行時繼承。有許多這樣的例子在BCL
的最有趣的,恕我直言,是RuntimeType
這是多麼的好廣大Type
實例在一個正在運行的系統中實現。大多數撥打o.GetType()
的電話實際上會返回一個RuntimeType
實例。
非常有趣的問題!但是請刪除不必要的代碼塊,它不會真正爲您的問題增加更多的價值,而不僅僅是'class MyType:Type {...}'。 – stakx 2012-02-20 19:33:15
我會讓編輯priv的人同意你這樣做,我認爲它很無奈看到派生類必須實現什麼才能編譯... – 2012-02-20 19:36:36