オンライン サービス (Azure Web サービス) に対する小さな WinRT クライアント アプリがあります。サーバーは JSON でエンコードされたオブジェクトを (潜在的な追加のメタデータと共に) クライアントに送信します。クライアントの責任は、このデータを適切にクラスに逆シリアル化し、適切なハンドラーに転送することです。
現在、受け取ったオブジェクトは単純な方法で逆シリアル化できます。
TodoItem todo = JsonConvert.DeserializeObject<TodoItem>(message.Content);
ただし、複数の種類のアイテムを受け取ることができます。そこで、現在考えていることは次のとおりです。
- 「Content-Object: TodoItem」のように、サーバー側のヘッダーに型情報を含めます。
- クライアント側で TodoItem に属性を定義します (以下を参照)
- サーバーからメッセージを受信すると、定義した属性を使用してクラスを見つけます。
- 解決された型で逆シリアル化メソッドを呼び出します
(2.で述べた属性の例)
[BackendObjectType="TodoItem"]
public class TodoItem
ただし、このアプローチに関する私の問題は、呼び出すことができないため、逆シリアル化の Type to Generics です。
Type t = ResolveType(message);
JsonConvert.DeserializeObject<t>(message.Content);
これに対するいくつかの解決策を見つけて、DeserializeObject のメソッド情報を取得し、リフレクションを使用してそれを呼び出すことを試みました。ただし、GetMethod() は WinRT には存在せず、DeserializeObject のジェネリック バージョンを取得するために使用できる代替手段を見つけることができませんでした (名前でフェッチすると非ジェネリック オーバーロードが得られるため)。リフレクションと GetMethod を使用してもかまいません。メソッドをキャッシュ (?) し、メッセージを受信するたびにメソッドを呼び出すことができるので、毎回解決する必要はありません。
では、どうすれば後半を達成できますか、および/またはこれにアプローチする別の方法はありますか?