1

既知のタイプで呼び出すと完全に正常に機能するJSONデシリアライザー(以下に表示)があります。

public static T Deserialize<T>(this object obj)
{
    var javaScriptSerializer = new JavaScriptSerializer();

    return (obj != null) ?
        javaScriptSerializer.Deserialize<T>(obj.ToString()) :
        default(T);
}

したがって、この呼び出しは機能します。

var newExampleTypeX = exampleJsonString.Deserialize<ExampleTypeX>();

しかし、私がやろうとしているのは、実行時に設定される型を渡し、「ExampleTypeX」の代わりにそれを使用することです。すると、次のコンパイルエラーが発生します。

Cannot resolve symbol 'someType'

したがって、someTypeの宣言は次のようになります(これは簡略化されたバージョンです)。

var someType = typeof(ExampleTypeX);
var newExampleTypeX = message.Deserialize<someType>();

なんらかの方法でDeserialize拡張メソッドを変更する必要がありますか、それとも実行時型を渡す方法を変更する必要がありますか?もしそうなら、どうすればそれを達成できますか。

4

1 に答える 1

2

ジェネリックスで使用される型は、コンパイル時を知っている必要があります。それがあなたがそれをすることができない理由です:

var someType = typeof(ExampleTypeX);
var newExampleTypeX = message.Deserialize<someType>();

JavaScriptSerializerとは関係ありません-それがジェネリックスの仕組みです。

本当に必要な場合は、リフレクションを使用してそれをバイパスできますが、そうすべきではないと思います。

ジェネリック型と拡張メソッドでのリフレクションの使用について詳しくは、次の2つの質問をご覧ください。

変数の型をパラメーターとして使用するC#のジェネリック

拡張メソッドを識別するためのリフレクション

于 2013-03-08T16:17:20.760 に答える