ひょっとして dynamic って拡張メソッドもイケるのかな?とふと思ったので試してみました。
こんな感じの適当なクラスと拡張メソッドを用意します。
class Hoge { public string Method() { return "Hoge's instance method."; } } static class HogeHelper { public static string ExtensionMethod(this Hoge hoge) { return "Hoge's extension method."; } }
まずは普通にインスタンスメソッドを dynamic から呼び出します。
var hoge = new Hoge(); dynamic dynamicHoge = hoge; System.Console.WriteLine(dynamicHoge.Method());
結果はこんな感じで普通です。
Hoge's instance method.
では本題のこうしたときです。
System.Console.WriteLine(dynamicHoge.ExtensionMethod());
拡張メソッドは単なるシンタックスシュガーなので、
hoge.ExtensionMethod();
このような拡張メソッドの利用は、
HogeHelper.ExtensionMethod(hoge);
こんな風に展開されて実行されます。
なので、Hoge に ExtensionMethod というメソッドがあるわけではなく、dynamic はバインドできないはずです。
さっきのコードを実行してみます。
System.Console.WriteLine(dynamicHoge.ExtensionMethod());
Runtime Binder Exception: 'Hoge' に 'ExtensionMethod' の定義がありません
はい、予想通りでした。もしかしたら拡張メソッドもバインドできてしまうのか...!? と思ったのですが、そんなことはありませんでした。
0 件のコメント:
コメントを投稿