1

我有一个可以序列化的通用类:

MyOwnGenericClass<T>

所以我想反序列化它,如果T是一个String实例来处理它,在另一种情况下我想抛出一个异常。

反序列化时如何知道泛型包含的类型MyOwnGenericClass<T>?我必须将以下代码转换为哪个类?

new BinaryFormatter().Deserialize(fileStrieam);
4

3 回答 3

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 >,我们唯一的头痛是找到那个东西是什么。

您可以发送布尔值、字符串、整数、int 的原始数组,甚至是StringBuilder. 然后是您的随行人员:您可以发送MyOwnGenericClass< int >, MyOwnGenericClass< string >(这是您唯一接受的)。

于 2013-02-27T17:22:26.883 回答
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();
}
于 2013-02-27T17:15:04.320 回答
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));
于 2013-02-27T17:15:29.517 回答