2011-11-02 41 views
1

我在一些調試過程中遇到了這段代碼。GetType()在Type的實例上返回什麼?

private bool HasBaseType(Type type, out Type baseType) 
{ 
    Type originalType = type.GetType(); 
    baseType = GetBaseType(type); 
    return baseType != originalType; 
} 

我最初的想法是,type.GetType()在方法的第一行總是產生的typeof(System.Type)等價,這似乎真的沒有意義的我在上下文中。然而,MSDN suggestsType覆蓋將從Object繼承的版本GetType()。然後,actual MSDN page on non-static Type.GetType()(不要與三個靜態版本混淆)表示GetType()方法返回「當前類型」。沒有進一步的相關解釋。

那麼,在上述方法中originalType的值是否等於typetypeof(System.Type)?我從文檔中不太確定。如果originalType相當於type,這將是一個副本type所以,如果GetBaseType方法改變其參數,originalType仍然相當於type在其原來的形式,無論內GetBaseType會發生什麼?

+0

私人布爾HasBaseType(對象實例,從類型BASETYPE) – BLUEPIXY

+0

如果你想要的是基本型,爲什麼不直接使用Type.BaseType財產? –

+0

@ tkeE2036我沒寫這段代碼;我在調試時發現它。而且,相信我,還有(可悲的)更多來自哪裏。 – Andrew

回答

6

1.

的GetType沒有被定義爲虛擬並且因此不能被覆寫。 System.Type不覆蓋對象的GetType,它隱藏它(在C#中它將用new關鍵字表示)。如果您使用拆卸工具如ILSpy,你會看到,它的實現如下:

public new Type GetType() 
{ 
    return base.GetType(); 
} 

正如你所看到的只是調用基類的GetType(即對象)的實施,因此最終結果是一樣的。此版本的GetType爲_Type接口提供了一個正式的實現。你通常不必擔心這個接口,它出於互操作性的原因。

2.

GetType方法在對象中定義的,並返回的System.Type。但仔細看看System.Type會發現它被定義爲抽象的,因此它永遠不會被實例化。所以從GetType中獲取具體內容的方法是獲取另一種類型,該類型來自System.Type。事實上,我們得到的是System.RuntimeType的一個實例,它來自System.Type。

原因是隻能有一個實例代表給定的類型。也就是說,不管你調用GetType的字符串有多少個不同的實例(例如),你仍然會得到完全相同的實例,因爲只有一個實例描述了一個字符串。爲了確保只有一個實例,System.Type被定義爲抽象的,所以它不能被用戶代碼實例化,並且System.RuntimeType被定義爲內部的,所以它只能被mscorlib中的代碼訪問,並且也不能被用戶代碼實例化。

3.

System.RuntimeType的存在是一個實現細節,可能是在忽略大多數情況下。對於所有意圖和目的,您的代碼可以假定GetType返回System.Type的一個實例。 唯一的例外是用下面的代碼(你可以用任何其他類型的替換字符串):

bool b = 
    typeof(string).GetType() == typeof(Type); 

如果不知道System.RuntimeType的,人們會認爲,因爲它假定的GetType返回系統,B將是真實的。類型,這顯然是右手錶達式的價值。但由於左手的值實際上是System.RuntimeType,b是假的(System.Type和System.RuntimeType是兩種不同的類型,因此不相等)。這是唯一需要了解System.RuntimeType的情況,以瞭解代碼的行爲。在任何其他情況下,GetType返回System.RuntimeType並且您可以忽略它並不重要。

4.

這裏是直接鏈接到該討論運行時類型信息(RTTI)我的.NET在線課程的一部分。我沒有提及System.RuntimeType,因爲就像我說的那樣,它是一個大部分可以忽略的實現細節。但是這個鏈接會給你更多的背景和對System.Type的更清晰的理解。

http://motti.me/tw

我希望這有助於!

Motti

+0

+1您的視頻真棒! – crypted

+0

謝謝,很高興你喜歡它... –

2

它看起來不是。當您通過Type實例致電GetType時,它似乎始終返回RuntimeType

我檢查這個對系統組件通過運行該代碼片段:

Assembly 
    .GetAssembly(typeof(int)) 
    .GetTypes() 
    .Where(type => type.GetType() == type) 

編輯:作爲盧克的意見明確,給予RuntimeType當「原始類型」是唯一真正的原始類型 - 它不適用於其他任何東西。由於該類型是系統內部的,因此該方法看起來簡直是錯誤的。

+0

因此,如果一個'System.RuntimeType'的實例被傳入OP的方法,那麼'originalType'確實等於'type'。在所有其他情況下,它們將不相等。 – LukeH

+0

@LukeH對。請記住,如果我編輯包括澄清? –

+0

當然不是。這是你的答案;編輯... – LukeH

3

類型實例的類型是System.RuntimeType。

{ 
     Console.WriteLine(typeof(System.Type).GetType()); 
     Console.WriteLine(typeof(string).GetType().GetType()); 
     Console.WriteLine(typeof(int).GetType()); 
     Console.WriteLine(typeof(List<int>).GetType()); 
    } 

System.RuntimeType 
System.RuntimeType 
System.RuntimeType 
System.RuntimeType 
相關問題