Silverlightでも匿名メソッドを使って非同期通信

ネタ元→Life is beautiful: 無名関数を使った非同期通信のススメ(JavaScript)

Silverlight でも WebClient や WebRequest を使って非同期呼び出しが可能だけど、結構面倒。ネタ元で紹介しているjQueryの例みたいに、サクッと記述できれば開発効率が良くなると思っていた。なので、私は次のようなヘルパークラスを作って利用している。

public static class WebHelper
{
    public static void Get<TResult>(string url, Action<TResult> callback)
    {
        WebRequest request = WebRequest.Create(url);
        request.Method = "GET";
        request.BeginGetResponse(result =>
        {
            WebResponse response = request.EndGetResponse(result);
            using (Stream stream = response.GetResponseStream())
            {
                XmlSerializer serializer = new XmlSerializer(typeof(TResult));
                TResult data = (TResult)serializer.Deserialize(stream);
                if (callback != null)
                {
                    callback(data);
                }
            }
        }, request);
    }

    // POST は省略
}

使い方はこんな感じ。

WebHelper.Get<Foo>(webapi_url, result =>
{
    doSomething(result);
});

クライアント側がデシリアライズできるように、サービス側はデータをXMLで出力する必要がある。汎用的に使えるクラスじゃないけど、参考までにどうぞ。誰かがステキなクラスを作ってくれることに期待。