我有一個可序列化泛型類:二進制反序列化的通用對象
MyOwnGenericClass<T>
所以我想反序列化,如果T
是String
情況下處理它,在另一種情況下,我想拋出一個例外。
如何知道類型的泛型包含在MyOwnGenericClass<T>
而反序列化? 到什麼班我必須投下下面的代碼?
new BinaryFormatter().Deserialize(fileStrieam);
我有一個可序列化泛型類:二進制反序列化的通用對象
MyOwnGenericClass<T>
所以我想反序列化,如果T
是String
情況下處理它,在另一種情況下,我想拋出一個例外。
如何知道類型的泛型包含在MyOwnGenericClass<T>
而反序列化? 到什麼班我必須投下下面的代碼?
new BinaryFormatter().Deserialize(fileStrieam);
那真的很容易。只需使用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();
}
所以你不檢查,如果T
是string
。 你檢查的不僅僅是:你正在檢查obj是否是MyOwnGenericClass<string>
。 沒有人會說它永遠是MyOwnGenericClass<something>
,唯一讓我們頭疼的是要找出那是什麼東西。
您可以發送bools,字符串,整數,int基本數組,甚至可以發送StringBuilder
。 然後你的隨從:你可以發送MyOwnGenericClass<int>
,MyOwnGenericClass<string>
(這是你唯一接受的)。
+1:使用'is'是一個比我更不傻的方法 – millimoose 2013-02-28 02:11:05
var test = new MyGenericType<string>();
var genericTypes = test.GetType().GetGenericArguments();
if (genericTypes.Length == 1 && genericTypes[0] == typeof(string))
{
// Do deserialization
}
else
{
throw new Exception();
}
您可以使用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));
http://msdn.microsoft.com/en-us/library/system.type.aspx - 搜索「泛型」,其中一種方法/屬性很可能就是您要查找的內容。 – millimoose 2013-02-27 17:09:33
「所以我想反序列化它,如果T是一個String實例處理它,在另一種情況下,我想拋出一個異常。」難道你們的班級是通用的嗎? – bas 2013-02-27 17:17:31
@bas哦,是啊:)我重讀了我的問題,並意識到這有點衝突......這不是我真正需要的,但是如果我知道如何做到這一點,我就可以做我真正需要的東西。 – 2013-02-27 17:40:38