我有一个可以序列化的泛型类:
MyOwnGenericClass<T>
所以我想反序列化它,如果T
是String
实例处理它,在另一种情况下我想抛出异常。
如何在反序列化时知道MyOwnGenericClass<T>
中包含泛型的类型?
我必须在下面的代码中编写什么类?
new BinaryFormatter().Deserialize(fileStrieam);
答案 0 :(得分: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();
}
因此,您不会检查T
是否为string
。
您检查的不仅仅是:您正在检查obj是否为MyOwnGenericClass< string >
。
没有人说它永远是MyOwnGenericClass< something >
,我们唯一的头痛就是找到那些东西。
您可以发送bool,字符串,整数,int的原始数组,甚至是StringBuilder
。
然后有你的随行人员:你可以发送MyOwnGenericClass< int >
,MyOwnGenericClass< string >
(这是你唯一接受的)。
答案 1 :(得分: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();
}
答案 2 :(得分: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));