Упакованный объект в фундаментальный тип в универсальном методе - PullRequest
0 голосов
/ 16 ноября 2018

Я использую библиотеку Newtonsoft.JSON для сериализации и десериализации объекта в общем методе. Проблема в том, что фундаментальные типы анализируются по-разному.

public T? GetKey<T>(string key) where T : struct
{
    string content = CrossSettings.Current.GetValueOrDefault(key, null);
    if (content == null)
        return null;
    object o = Newtonsoft.Json.JsonConvert.DeserializeObject(content);
    T v = (T)o;
    return v;
}

Когда сохраненное значение равно "1" (переменная content ), внутренний тип объекта длинный, и я не могу привести его непосредственно из объекта к T = int (InvalidCastException). Подход Propper будет приводить объект сначала к long, а затем к int, но поскольку это универсальный метод, я не знаю, какой будет тип результата.
Я также пытался использовать Activator.CreateInstance(o.GetType(), o);, но это снова возвращает объект. У вас есть идеи, как решить эту проблему?

РЕДАКТИРОВАТЬ: упрощенная задача

string content = "1";
object o = Newtonsoft.Json.JsonConvert.DeserializeObject(content);
int v = /* ??? */;
Debug.Assert(v == 1);

1 Ответ

0 голосов
/ 16 ноября 2018

Вам необходимо указать тип. Десериализатор не может угадать, какой тип следует выбирать при десериализации. Передайте переданный параметр общего типа в метод DeserializeObject.

public T? GetKey<T>(string key) where T : struct
{
    string content = CrossSettings.Current.GetValueOrDefault(key, null);
    if (content == null)
        return null;
    return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(content);
}
...