Late Binding Macro

メーリングリストを見ていたら、Late Bindingを行うマクロが投稿されていました。面白そうなので、Booサイトにあったduck typingのサンプルを移植してみました。

using System;
using System.Threading;
using Kitsu.LateBinding;

def CreateInstance (progID : string) {
    def t = Type.GetTypeFromProgID (progID);
    Activator.CreateInstance (t);
}

def ie = CreateInstance ("InternetExplorer.Application");
late {
    ie.Visible = true;
    ie.Navigate2 ("http://nemerle.org/");
    while (ie.Busy:>bool) Thread.Sleep (500);

    def doc = ie.Document;
    Console.WriteLine ("{0} is {1} bytes long.", doc.title, doc.fileSize);
}

変数ieの型はObjectなのに、メソッドやプロパティにアクセスしています。仕掛けはlateブロックで、この中ではLate Binding、つまり、Reflectionを使ったInvoke〜に変換されるのでした。

COM呼び出しなどの場合、便利そうですね。マクロの詳細についてはこちらを見てください。