拡張メソッドって何ぞ?

<はじめに>
msdnより
拡張メソッド (C# プログラミング ガイド)
拡張メソッドを使用すると、新規の派生型の作成、再コンパイル、または元の型の変更を行うことなく既存の型にメソッドを "追加" できます。

えーっ!?そんなことできるんですか!?

自分の不勉強をかみしめながら調べてみると、
拡張メソッドとしてstaticメソッドを用意しておくと、
あたかも他のクラスのインスタンスメソッドのように扱えるよ!ってことらしい。


<プログラム>
■拡張メソッドの実装

class Program
{
    static void Main(string[] args)
    {
        string morning = "Morning";

        morning.Hoge();

        morning.Fuga("Good");

        OtherClass otherClass = new OtherClass();

        otherClass.Foo();
    }
}

static class Kakucho
{
    public static void Hoge(this string x)
    {
        Console.WriteLine(x);
    }

    public static void Fuga(this string x, string y)
    {
        Console.WriteLine(y + " " + x );
    }

    public static void Foo(this OtherClass x)
    {
        Console.WriteLine(x.message);
    }
}

class OtherClass
{
    public string message = "Hello World";
}


<実行結果>
f:id:nomurabbit:20131017085351p:plain


<まとめ>
拡張メソッドを定義するときに、第一引数が対象のクラス、第二引数以降がメソッド呼び出し時の引数になるので注意。
慣れないと混乱するかもしれないけど難しいことはないです。

同じクラスに対して名前空間ごとに複数の拡張メソッドを定義することができるので、
例えば同じクラスを別の名前空間で使う時に、拡張メソッドを使って振る舞いを分けることができたりするのかな?