2012年12月4日火曜日

[C#]dynamicと拡張メソッド

ひょっとして 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 件のコメント:

コメントを投稿

TFT 10.14 Peeba Comp

こちらのガイドの自分用まとめです。 https://www.reddit.com/r/CompetitiveTFT/comments/hraunp/tft_1014_break_the_meta_new_peeba_comp_set_35/ 難しいですが完成すると非常に強く、プレ...