Двоичная десериализация универсального объекта в 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));