1

我有一個可序列化泛型類:二進制反序列化的通用對象

MyOwnGenericClass<T> 

所以我想反序列化,如果TString情況下處理它,在另一種情況下,我想拋出一個例外。

如何知道類型的泛型包含在MyOwnGenericClass<T>而反序列化? 到什麼班我必須投下下面的代碼?

new BinaryFormatter().Deserialize(fileStrieam); 
+0

http://msdn.microsoft.com/en-us/library/system.type.aspx - 搜索「泛型」,其中一種方法/屬性很可能就是您要查找的內容。 – millimoose 2013-02-27 17:09:33

+0

「所以我想反序列化它,如果T是一個String實例處理它,在另一種情況下,我想拋出一個異常。」難道你們的班級是通用的嗎? – bas 2013-02-27 17:17:31

+0

@bas哦,是啊:)我重讀了我的問題,並意識到這有點衝突......這不是我真正需要的,但是如果我知道如何做到這一點,我就可以做我真正需要的東西。 – 2013-02-27 17:40:38

回答

4

那真的很容易。只需使用object像這樣:

object obj = new BinaryFormatter().Deserialize(fileStrieam); 

,然後做什麼,你說你會做:

if (!(obj is MyOwnGenericClass<string>)) 
    throw new Exception("It was something other than MyOwnGenericClass<string>"); 
else { 
    MyOwnGenericClass<string> asMyOwn_OfString = obj as MyOwnGenericClass<string>; 

    // do specific stuff with it 
    asMyOwn.SpecificStuff(); 
} 

所以你不檢查,如果Tstring。 你檢查的不僅僅是:你正在檢查obj是否是MyOwnGenericClass<string>。 沒有人會說它永遠是MyOwnGenericClass<something>,唯一讓我們頭疼的是要找出那是什麼東西。

您可以發送bools,字符串,整數,int基本數組,甚至可以發送StringBuilder。 然後你的隨從:你可以發送MyOwnGenericClass<int>MyOwnGenericClass<string>(這是你唯一接受的)。

+0

+1:使用'is'是一個比我更不傻的方法 – millimoose 2013-02-28 02:11:05

1
var test = new MyGenericType<string>(); 

var genericTypes = test.GetType().GetGenericArguments(); 
if (genericTypes.Length == 1 && genericTypes[0] == typeof(string)) 
{ 
    // Do deserialization 
} 
else 
{ 
    throw new Exception(); 
} 
1

您可以使用Type.GetGenericArguments()獲得的類型與在運行時創建通用的實際參數值:

class MyGeneric<TValue> {} 

object stringValue = new MyGeneric<string>(); 
object intValue = new MyGeneric<int>(); 

// prints True 
Console.WriteLine(stringValue.GetType().GetGenericArguments()[0] == typeof(string)); 
// prints False 
Console.WriteLine(intValue.GetType().GetGenericArguments()[0] == typeof(string)); 
相關問題