Двоичная десериализация универсального объекта в C#

У меня есть универсальный класс, который можно сериализовать:

MyOwnGenericClass<T>

Поэтому я хочу десериализовать его, и если T это String экземпляр обрабатывает это, в другом случае я хочу сгенерировать исключение.

Как узнать тип общего дженерика в MyOwnGenericClass<T> при десериализации? К какому классу я должен привести следующий код?

new BinaryFormatter().Deserialize(fileStrieam);

3 ответа

Решение

Это действительно легко. Просто используйте 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, Вы проверяете больше, чем это: вы проверяете, является ли объект MyOwnGenericClass< string >, Никто не говорил, что это всегда будет MyOwnGenericClass< something > и наша единственная головная боль - найти что-то такое.

Вы можете отправлять bools, string, int, примитивные массивы 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));
Другие вопросы по тегам