C# 4.0の新機能

PDC2008のAnders Hejlsbergのセッションをビデオで観てたら、新機能の紹介があったので書いてみる。

Dynamically Typed Objects

動的型付けオブジェクト?

以前は、以下のようなオブジェクトのメソッド呼び出しを

Calculator calc = GetCalculator();
int sum = calc.Add(10, 20);

動的にやろうとすると、リフレクションを使ってやっていたわけだけど、

object calc = GetCalculator();
Type calcType = calc.GetType();
object res = calcType.InvokeMember(
    "Add", BindingFlags.InvokeMethod, null, new object[] { 10, 20 }
);
int sum = Convert.ToInt32(res);

C#の次期バージョンでは、以下のようにできるようになるらしい。

dynamic calc = GetCalculator();
int sum = calc.Add(10, 20);

dynamicというキーワードで変数を宣言する事で動的型付けのオブジェクト(ScriptObject?IDynamicTypedObject)とする事ができる。

後は普通に呼び出せるみたい。

まるっきり動的言語ですね!!

Silverlightでのデモ

他にもSilverilghtでのデモもあって、現状ではSilverlightからJavaScriptを呼び出す場合、ScriptObjectを使ってリフレクションみたいな感じで呼び出すので手間が掛かっていたけど、これも簡潔に書けるようになるらしい。

例えば、SilverlightをホストするHTMLに以下のJavaScript関数が定義されている場合、

function ShowMessage(string msg) {
    alert(msg);
}

Silveright側からこの関数を呼び出すには以下のようにする必要があった。

var window = HtmlPage.Window;
window.Invoke("ShowMessage", "hello");

これがC#の次期バージョンでは、

dynamic window = HtmlPage.Window.AsDynamic();
window.ShowMessage("hello");

と、自然な感じで呼び出せるようになるらしい。

AsDynamicというメソッドで動的型付けなオブジェクトに変換できるみたいね*1

他にも色々あるみたいなので、これから続きを観る。

*1:object型に追加された?拡張メソッドか?