約2年ぶりに本格的にC# に取り組むことになったのですが、C#3.0の新しい機能をいろいろ触っています(2年前なので2.0までの知識しかありません)。
で、今日は拡張メソッドなるものを修得しました。
Rubyでは既存のクラスに機能を追加したい場合、たとえば数値クラスであるFixnumクラスにsayHelloという文字列を表示するメソッドを追加する場合は、

class Fixnum
??def sayHello
?? ?p "hello No.#{self}"
??end
end

1.sayHello() ?# hello No.1
2.sayHello() ?# hello No.2


と書けば簡単に新たに継承クラスを作ることなく拡張機能を実現できますが、JavaやC#など普通の静的な言語ではこんなことはできません。
しかし、C#3.0の拡張メソッドを使用すれば同じようなことができてしまいます。
同じようにC#の整数型intに対してSayHelloメソッドを追加する場合は、

static class MyExtension
{
??public static string SayHello(this int i)
??{
?? ?Console.WriteLine("hello No.{0}", i);
??}
}

1.SayHello(); ?// hello No.1
2.SayHello(); ?// hello No.2

このようにするだけです。
まず拡張したい機能を静的メソッドとして持つクラスを定義して、それを同じ名前空間に宣言すればOKです。
RubyでいえばModuleを定義してそれをincludeするのと同じようなものです。
C#では名前空間をusingで宣言する、ってことになるのですが、、、。もちろん拡張メソッドを持つクラスが同じ名前空間に存在する場合は何もせずにそのまま使用できますが、、、。
実際にC#3.0で導入されたLINQはこの機能をフルに使っています(というかそのために必要とされたのでしょう)。

一応仕事で触れてなくても最新情報だけは目を通すようにしていたので、だいぶ前からこの機能の存在自体は知ってはいたのですが、最初はなんの役に立つのかなぁ、とか思っていたりしました(そのころはまだRubyもやってなかったし、、、)。

しかしRubyのような柔軟な言語でいわゆるダックタイプ・プログラミングに慣れてしまうと、このよう機能が静的言語であるC#でも使用できるというのは非常にうれしいです。
静的言語の安全性、パフォーマンスと動的言語の柔軟性のいいとこ取りという、いかにもMS的です(そーゆーところは全然嫌いじゃありません)。



詳しくは、「拡張メソッド (C# プログラミング ガイド)」