2016-12-29 10 views
0

Я пытаюсь написать анонимный метод с целью десериализации Json в DataContract. Это позволит мне иметь что-то повторно используемое без необходимости писать один и тот же код для каждого класса DataContract, который я написал для каждого json-запроса.Анонимный тип в методе десериализации json из строки в DataContract

код у меня есть до сих пор, заключается в следующем:

public T Json2Object<T>(string json, Encoding encoding) { 
    T result; 
    DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); 
    using (Stream s = new MemoryStream((encoding ?? Encoding.UTF8).GetBytes(json ?? ""))) { 
     result = ser.ReadObject(s) as T; 
    } 
    return result; 
} 

Это дает мне ошибки в IDE следующим образом:

error

Как это может быть отрегулирована без Аппаратно кодируя тип так, чтобы он работал так, как я предполагаю?

ответ

1

Ключевое слово as означает, что тип является ссылочным типом, а не типом значения. Вы не можете сохранить null в типе значения. Таким образом, вам необходимо либо ограничить тип T к опорному типу:

public T Json2Object<T>(string json, Encoding encoding) where T : class { 
    // ... 
} 

Или отливать, а не использовать as:

public T Json2Object<T>(string json, Encoding encoding) { 
    T result; 
    DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); 
    using (Stream s = new MemoryStream((encoding ?? Encoding.UTF8).GetBytes(json ?? ""))) { 
     result = (T)ser.ReadObject(s); 
    } 
    return result; 
} 
+0

Очень приятно, спасибо. Если у вас есть 'where T: class', мне нужно заменить class на класс. Например, если мой класс datacontract называется 'Foo', это будет записываться как' where T: Foo' или будет ли '' где T: class' работать, как вы его написали? –

+1

@KraangPrime Nope, 'где T: class' - это именно то, что вам нужно написать. Он ограничивает 'T' ссылочным типом *. Обратите внимание, что вам будет запрещено писать 'Json2Object (someJson, someEncoding)', поскольку 'int' является типом значения. Если вы хотите иметь возможность проходить в 'int', вам нужно использовать подход кастингов. – Rob

+1

Это потрясающе. Именно то, что мне нужно. Спасибо :) –

 Смежные вопросы

  • Нет связанных вопросов^_^