こんばんは。きわさです。
今回はC#の拡張メソッドについてです。
例えば、下記のような場合について考えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 | public void Test() { DateTime date1 = new DateTime(2000, 1, 1); DateTime date2 = new DateTime(2018, 1, 1); DateTime date3 = new DateTime(2019, 1, 1); List< string > list = new List< string >() { date1.ToString( "yyyyMMdd" ), date2.ToString( "yyyyMMdd" ), date3.ToString( "yyyyMMdd" ), }; } |
上記では、DateTime型変数が複数あり、すべてyyyyMMdd形式の文字列としてlistに入れています。
さて、この「DateTime型からyyyyMMdd形式の文字列の変換処理」について、このほかにも何度も使用するようであれば、共通処理を作りたいと思います。
ためしに共通関数にしてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public void Test() { DateTime date1 = new DateTime(2000, 1, 1); DateTime date2 = new DateTime(2018, 1, 1); DateTime date3 = new DateTime(2019, 1, 1); List< string > list = new List< string >() { GetYYYYMMDD(date1), GetYYYYMMDD(date2), GetYYYYMMDD(date3), }; } private string GetYYYYMMDD(DateTime date) { return date.ToString( "yyyyMMdd" ); } |
このようにDateTime型を引数として文字列を返すメソッドをつくって共通化することもできますが、
拡張メソッドを使用して書いてみましょう。
1 2 3 4 5 6 7 | public static class Extension { public static string ToYYYYMMDD( this DateTime src) { return src.ToString( "yyyyMMdd" ); } } |
静的クラスを用意して、静的メソッドとして処理を書いています。
さらに引数では this DateTime としています。
これで準備はOKです。
下記のように使用することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 | public void Test() { DateTime date1 = new DateTime(2000, 1, 1); DateTime date2 = new DateTime(2018, 1, 1); DateTime date3 = new DateTime(2019, 1, 1); List< string > list = new List< string >() { date1.ToYYYYMMDD(), date2.ToYYYYMMDD(), date3.ToYYYYMMDD(), }; } |
ToYYYYMMDDの引数を this DateTime としたことで、
このように、DateTime型にインスタンスメソッドを追加したかのように使用することができるようになります。
自前のクラスであれば、インスタンスメソッドを追加してやれば済む話ですが、今回のようにもとの型を変更できない場合などに後付けで処理を追加することができます。