2017-06-20 26 views
-1

當我在Type對象上做ToString()時,我找回了這個字符串。但是,當我在同一個字符串上調用GetType時,我得到一個空值。我該如何解決?爲什麼Type.GetType()不適用於此字符串?

Type type1 = obj.GetType(); 
string str = type1.ToString(); //Returns A+B+CGeneric`1+D[E+F] 

Type type2 = Type.GetType(str); //Returns null 

它是否與(+)符號而不是(。)有關?

編輯 - 我試圖避免調用全名,因爲它返回版本號。將來,如果版本號發生更改,我將無法使用類型名稱對對象進行反序列化。

+0

快速查看[documentation](https://msdn.microsoft.com/en-us/library/w3f99sx1(v = vs.110).aspx)可以解決此問題。輸入字符串不是完全限定的名稱,因爲'type.ToString()'不返回完全限定的類型名稱。 – Amy

+0

如果類定義隨版本號一起更改會怎樣?你想將一些數據反序列化到一個已經被修改的類中,同時忽略這些修改? – Amy

+0

@Deadzone對不起有一個錯字 – user3587180

回答

1

你需要獲得包括命名空間中的類的全名:

var typeName = obj.GetType().FullName; 
Type type2 = Type.GetType(typeName); 
+0

使用'type.AssemblyQualifiedName'會更好。 – Amy

+2

@ user3587180您問題中的代碼顯示您獲取某個類型的名稱,並立即通過該名稱查詢該類型。現在聽起來像是序列化。這是你應該在問題中包含的重要細節,以及任何其他相關的上下文。 – Amy

+0

@ user3587180你的代碼看起來完全是人造的,爲什麼你會嘗試按名稱獲取類型,如果你已經在第一行做了這個'Type type1 = obj.GetType();'? – Deadzone

相關問題