我有一个可以序列化的通用类:
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 >
,我们唯一的头痛是找到那个东西是什么。
您可以发送布尔值、字符串、整数、int 的原始数组,甚至是StringBuilder
. 然后是您的随行人员:您可以发送MyOwnGenericClass< int >
, MyOwnGenericClass< string >
(这是您唯一接受的)。
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));