こんにちは、サイオステクノロジー技術部 武井です。今回はC#の拡張メソッドについて書きたいと思います。これも何番煎じくらいかもうわかりません。私の備忘録も兼ねています。
拡張メソッド
自分が作ったクラスにメソッドを追加するのは簡単ですが、他人が作ったクラスにメソッドを追加したいと思ったことはないでしょうか?通常であれば、そのクラスの作者にお願いしないと、メソッドの拡張は実現できませんが、C#は拡張メソッドという機能を使うと、簡単に実現できます。しかも、そのメソッドはインスタンスメソッドとして使うことが出来ます。
構文は以下になります。
static [拡張メソッドの戻り値の型] [メソッド名](this 拡張対象のクラス,[引数]) { ・・・処理・・・ }
用途があるのかわかりませんが、string型の文字列の末尾に「※ただしイケメンに限る」を追加するという拡張メソッドをstringクラスに追加してみたいと思います。
static class StringExtensions { public static string AddIkemen(this string s) { return s + "※ただしイケメンに限る"; } } class ExtensionMethodTest { static void Main(string[] args) { string s = "今日はポイント5倍デーです。"; Console.Write(s.AddIkemen()); Console.ReadLine(); } }
結果は以下のとおりです。
今日はポイント5倍デーです。※ただしイケメンに限る
インターフェースにも拡張メソッド
全く同様の手順でインターフェースにも拡張メソッドを追加できます。こちらのほうがよく使われていますね。
ここでIEnumerableインターフェースを拡張する例を考えてみます。IEnumerable<string>の場合、リストすべての文字列の末尾に「※ただしイケメンに限る」を追加してみます。
static class Extensions { public static IEnumerableAddIkemen(this IEnumerable list) { foreach (string x in list) { yield return x + "※ただしイケメンに限る"; } } } class Program { static void Main(string[] args) { IEnumerable lists = new string[] { "この商品は10%オフです。", "ご自由にお取りください。", "ご試食はこちらからお願いします。" }; lists = lists.AddIkemen(); foreach (var x in lists) { Console.WriteLine(x); } Console.ReadLine(); } }
結果は以下のようになります。
この商品は10%オフです。※ただしイケメンに限る ご自由にお取りください。※ただしイケメンに限る ご試食はこちらからお願いします。※ただしイケメンに限る
絶望感たっぷりですね。
まとめ
拡張メソッド便利ですね。例が適切でなかったかもしれません。便利なのですが、あまり使いすぎると、どのクラスやインターフェースにどのメソッドが拡張されているのかわからなくなるような気がします。では、素敵な拡張メソッドライフを。No Extension Method、No Life!!