2017-02-27 16 views
0

文字列と型を汎用メソッドに渡して逆直列化を試みたいとします。ここで私が持っているものです:型を非直列化の汎用メソッドに渡す方法

public static T DeserializeObject<T>(string value, Type type) 
{ 
    T result = default(T); 

    try 
    { 
     result = JsonConvert.DeserializeObject<type>(value); 
     System.Diagnostics.Debug.WriteLine($"\nDeserialization Success! : { result }\n"); 

    } 
    catch (Exception ex) 
    { 
     System.Diagnostics.Debug.WriteLine($"\nDeserialization failed with exception : { ex }\n"); 
    } 

    return result; 
} 

「GroupObjectは、」私は返すしたいタイプでメソッドを呼び出すために私の試み:エラーで

var deserialized = Core.Deserializer.DeserializeObject(value: response, type: GroupObject); 

結果:

Error CS0119: Expression denotes a `type', where a `variable', `value' or `method group' was expected (CS0119) 

これは可能ですか?

答えて

1

正しく理解していただいても、実際にはtypeパラメータは必要ありません。あなたは既にジェネリック薬を持っていて、それをすることができます。

GroupObject deserialized = Core.Deserializer.DeserializeObject<GroupObject>(response) 

これは、他のクラスと同様に機能します。

Foo foo = Core.Deserializer.DeserializeObject<Foo>(response) 

P.S.実際にtypeを使用しているとは思われません。

+0

私はそれを使用したいと思いますこのように:Core.Deserializer.DeserializeObject (レスポンス)他のタイプのオブジェクトを逆シリアル化するメソッドを再利用することができます。 –

+0

はい、あなたはすでにそれを行うことができます。角括弧 ''に任意の型を渡すだけです。これはジェネリックスの動作方法です –

+0

私は答えを編集しました。 –

4

お客様の方法では、変数typeは使用されません。

また、あなたがtypeof機能を使用するタイプのパラメータを持つメソッドを呼び出すために:

var deserialized = Core.Deserializer.DeserializeObject(value: response, type: typeof(GroupObject)); 

は確かに、あなたはここで多くの情報を提供していませんが、私の経験で、あなたはより多くのような方法を探していますこの:

public static T DeserializeObject<T>(string value) 
{ 
    T result = default(T); 
    try { 
     result = JsonConvert.DeserializeObject<T>(value); 
    } 
    return result; 
} 

は次のように呼ばれるように:

var deserialized = Core.Deserializer.DeserializeObject<GroupObject>(value: response); 
+0

私はパラメータとして型を含める理由は、同じメソッドを使用して他の特定の型のオブジェクトを逆シリアル化したいと考えています –

+1

'var deserialized = Core.Deserializer.DeserializeObject (value:response);'ジェネリックスを読むべきです。 –

+0

メソッドを呼び出すときに型を指定できるようにします。私は常に文字列を渡していますが、時にはCompanyObjectを返したいときや、GroupObject/SomeOtherObjectを返す場合もあります。 –

0

実際にはメソッド内にパラメータtypeを使用していません。実際には、そのパラメータは必要ありません。メソッドからそのパラメータを削除できます。

ethodでデシリアライズを試みます。ここで私が持っているものである:ここでは

public static T DeserializeObject<T>(string value) 
{ 
    T result = default(T); 

    try 
    { 
     result = JsonConvert.DeserializeObject<T>(value); 
       System.Diagnostics.Debug.WriteLine($"\nDeserialization Success! : { result }\n"); 
    } 
    catch (Exception ex) 
    { 
     System.Diagnostics.Debug.WriteLine($"\nDeserialization failed with exception : { ex }\n"); 
    } 

    return result; 
} 
-1

は私のソリューションです:

public static T DeserializeObject<T>(string inputString) 
{ 
    T result = default(T); 

    using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(inputString))) 
    { 
     try 
     { 
      var serializer = new DataContractJsonSerializer(typeof(T)); 

      result = (T)serializer.ReadObject(ms); 

      WriteLine($"\nDeserialization Success : { result }\n"); 
     } 
     catch (Exception ex) 
     { 
      WriteLine($"\nDeserialization Failed With Exception : { ex }\n"); 
     } 
    } 

    return result; 
} 

「タイプが」メソッドの呼び出しに含まれている:

var deserialized = Core.Deserializer.DeserializeObject<GroupObject>(value: response); 
関連する問題