0

メソッドを呼び出すと、次のコードが失敗します。例外なし; すべてがクラッシュします。このコードはWindowsPhone7ポータブルクラスライブラリにありますが、何が起こっているのでしょうか。

public static object Deserialize(string input, Type type)
{
    var castMethod = typeof(ModelBase).GetMethod("Cast").MakeGenericMethod(type);
    object castedObject = castMethod.Invoke(null, new object[] { input });
    return castedObject;
}

public static T Cast<T>(string input)
{
    return JsonConvert.DeserializeObject<T>(input);
}
4

2 に答える 2

1

MakeGenericMethodは存在しますが、Silverlight forWindowsPhoneではサポートされていません。

「プラットフォームノート」の下でここをチェックしてください:http://msdn.microsoft.com/en-us/library/system.reflection.methodinfo.makegenericmethod (v = vs.95).aspx

于 2012-11-03T17:41:02.253 に答える
1

短い答え:

ここでは、熟考する必要はまったくありません。を呼び出すだけで、Deserialize(string, Type)メソッドを置き換える(および削除する)ことができます。Cast<T>JsonConvert.DeserializeObject(string, Type)

長い答え:

あなたのCast<T>方法は不必要に物事を複雑にします:

  • タイプパラメータTがあり、オブジェクト/値を返しますTが、呼び出し元のメソッド(Deserialize)はとにかくこれを気にしません。「型なし」objectを返すのでCast、同様に返すことobjectもできます。

  • Typeオブジェクトを対応する型引数に変換するT必要があるということは、何らかの型反射を行う必要があることを意味します。ただし、Cast<T>一般的でない場合(および上記で指摘したように、一般的である必要はありません)、そのすべての反映は必要ありません。

  • 結局のところ、Json.NETも型パラメーターTを必要としません。JsonConvert.DeserializeObjectオブジェクトを受け入れる非ジェネリックな「オーバーロード」がありTypeます。

したがって、メソッドと反射迂回を取り除きCast<T>、非ジェネリックJsonConvert.DeserializeObject(string, Type)オーバーロードを使用するだけです。

PS:元の質問に関して、CLI(.NET、.NET Compact、Silverlight、およびWP7によって実装される)を説明するECMA-335標準によれば、Reflectionはカーネルライブラリの一部ではなく、別個のものですが、オプションのライブラリ。特定のプラットフォーム(WP7、AFAIKなど)に存在しない場合、オブジェクトは基本的に不透明なオブジェクトとして扱われ、そこから他のインスタンスTypeを派生させることはできません。Type

于 2012-11-03T23:14:59.700 に答える