2016-12-29 5 views
0

JsonをDataContractに逆シリアル化する目的で匿名メソッドを作成しようとしています。これは、私が各jsonクエリのために書いた各DataContractクラスに対して同じコードを書く必要なしに、何かを再利用できるようにするでしょう。それはIDEで私にエラーを与えている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; 
} 

次のように:

error

これはハードずに調整することができますどのように次のように

私がこれまで持っているコードは、ありますタイプをコーディングして、私が意図した通りに動くようにしますか?

答えて

1

キーワードasは、タイプが参照タイプであり、値タイプではないことを示します。値の型にnullを格納することはできません。

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

それともキャストではなくasを使用します:したがって、あなたのいずれかが参照型にタイプTを制限する必要がある

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

非常に素晴らしい、ありがとうございました。 'どこにT:class'があるのか​​' class'を特定のクラスに置き換える必要があります。例えば、私のdatacontractクラスの名前が 'Foo'の場合、' T:Foo'と書かれていますか、 'T:class'はあなたの書いたとおりに動作しますか? –

+1

@KraangPrime Nope、 'T:class'はあなたが書く必要がある場所です。 'T 'を*参照型*に制限します。 'int'は値の型なので' Json2Object (someJson、someEncoding) 'を書くことは禁止されていることに注意してください。 'int'を渡すことができるようにするには、代わりにキャストのアプローチを使用する必要があります。 – Rob

+1

それは素晴らしいです。正確に私が必要としたもの。ありがとうございました :) –

関連する問題