2011-04-20 88 views
64

我想今天做一些常規檢查,並獲得所有類型的組件(通過調用Assembly.GetTypes()),當我偶然到的東西:C#中System.Type和System.RuntimeType之間的區別是什麼?

System.RuntimeType:[First.Namespace.FirstClass] 

每當我嘗試這種類型比較typeof(FirstClass),他們不平等。所以,當我試圖找到所有包含FirstClass作爲通用參數的類型時,我沒有找到任何。

System.RuntimeTypeSystem.Type有什麼區別?

有什麼方法可以解決我的問題嗎?

+6

你能提供一個小程序,演示了您遇到的問題? – 2011-04-20 23:49:37

+0

我去,但得到的答覆已:P – 2011-04-21 00:30:30

回答

79

System.RuntimeType是派生自抽象基類System.Type的具體類。由於System.RuntimeType未公開,因此您通常會遇到System.Type

當您嘗試獲取對象的類型並錯誤地將GetType()稱爲代表第一個對象類型的另一個對象時,可能會出現混淆,而不是直接使用該對象。然後Type.ToString()將返回"System.RuntimeType"當它被稱爲上的對象是代表類型:

string str = string.Empty; 
Type strType = str.GetType(); 
Type strTypeType = strType.GetType(); 
strType.ToString();  // returns "System.string" 
strTypeType.ToString(); // returns "System.RuntimeType" 

例如,在this blog post有人試圖得到一個列的類型在數據庫中,做這樣的事情:

object val = reader.GetFieldType(index); 
Type runtimeType = val.GetType(); 
PropertyInfo propInfo = runtimeType.GetProperty("UnderlyingSystemType"); 
Type type = (Type)propInfo.GetValue(val, null); 

由於val已經是Type對象,因此val.GetType()將返回另一個Type對象,表示類型System.RuntimeTime,因爲這是用於表示原始類型對象的具體類型。然後,博客文章顯示了一些不必要的反射掛羊頭賣狗肉,以獲得原始類型對象的類型,真的一切都需要的時候,這是:

Type type = reader.GetFieldType(index) as Type; 

因此,如果您Type對象報告說,它代表了一種System.RuntimeType,確保你沒有意外地在你已經有的類型上調用GetType()

+0

如果只檢查對象是,就算你通過'typeof運算(INT)''的Type',稍後即返回真實例中的第一個代碼片段。第二個代碼片段不能用於比較'typeof(string).GetType()'和'typeof(Type)'。 – 2011-04-21 00:25:25

+0

這正是我所期待的!我確實找到了托馬斯達內克的帖子,但沒有找到Doogal Bell的 – 2011-04-21 00:28:10

+1

@Mark Cidade。很好,發現了,謝謝。有固定的答案更有幫助,希望通過引用該博客帖子來澄清我引入的任何混淆。 – Ergwun 2011-04-21 02:54:36

2

從答案Different between System.Type and System.RuntimeTypeThomas Danecker

System.Type的是一個抽象基類。 CLR在內部類型 System.RuntimeType中具體實現了 。由於此 typeof(string).GetType()返回一個 RuntimeType但typeof(類型)返回一個 正常類型。使用.Equals方法 確實實際上是一個object.ReferenceEquals ,它返回false。要獲得期望結果的 ,可以使用 type.IsInstanceOfType(element)。如果元素是 的派生類型,則此 也將返回true。如果您想檢查 的確切類型,則返回值 對您的方法錯誤是需要的 結果。您也可以使用 checkType(arrayType, Type.GetType(「System.RuntimeType」))至 檢查RuntimeType。

0

簡單...

"".GetType().ToString()   == "System.String" 

    "".GetType().GetType().ToString() == "System.RuntimeType" 

我現在想想它的方式是System.Type是一種基本類型的表示運行時對象類型請求結果的類型,即System.RuntimeType。所以,當你請求一個對象的類型,如,"".GetType()System.Type的實例返回的是它的後代,System.RuntimeType。事實上,人們應該期待的是,typeof(System.Type).GetType()System.RuntimeType爲好,但我覺得框架專門用來防止這個...對稱性。

相關問題