俺のライブラリを見せてやる
C# 3.0になってライブラリもだいぶ変わりました。というか2.0までに作ったやつは全面的に書き直さざるを得ない。
継承してたとこやinterfaceを実装してたとこはことごとくdelegateとラムダ式に置き換わる。コレクションをいじるためのメソッドはほとんどがLINQに置き換わり足りないものはExtensionMethodになる。
これがやっぱり超便利でいまさらC# 2.0には戻れないのですな。ガッハッハ。
public static partial class New { public static Func<T> Func<T>(Func<T> func) { return func; } public static Func<T1, TR> Func<T1, TR>(Func<T1, TR> func) { return func; } ...... public static Func<T1, T2, T3, T4, TR> Func<T1, T2, T3, T4, TR>( Func<T1, T2, T3, T4, TR> func) { return func; } まず、FuncをNewするのに使うStaticメソッド。New.Func(string str => new Hoge(str)) といった感じで使う。コンストラクタでは型推論してくれないのでそこを省略できる。それだけ。 public static T[] Array<T>(Func<T> value, int length) { var array = new T[length]; for (int i = 0; i < array.Length; ++i) { array[i] = value(); } return array; } var hoges = New.Array(() => new Hoge(), 10); 見たいな感じで使う。配列の宣言と初期化が同時に出来まっせ。 public static void TypeSwitch<TSelf, T1>(this TSelf obj, Action<T1> a1) { TypeSwitch(obj, new TypeCase[] { TypeCase.New(a1) }, null); } public static void TypeSwitch<TSelf, T1>(this TSelf obj, Action<T1> a1, TypeCase<TSelf> @default) { TypeSwitch(obj, new TypeCase[] { TypeCase.New(a1) }, @default); } public static void TypeSwitch<TSelf, T1, T2>(this TSelf obj, Action<T1> a1, Action<T2> a2) { TypeSwitch(obj, new TypeCase[] { TypeCase.New(a1), TypeCase.New(a2) }, null); } public static void TypeSwitch<TSelf, T1, T2>(this TSelf obj, Action<T1> a1, Action<T2> a2, TypeCase<TSelf> @default) { TypeSwitch(obj, new TypeCase[] { TypeCase.New(a1), TypeCase.New(a2) }, @default); } public static void TypeSwitch<TSelf, T1, T2, T3>(this TSelf obj, Action<T1> a1, Action<T2> a2, Action<T3> a3) { TypeSwitch(obj, new TypeCase[] { TypeCase.New(a1), TypeCase.New(a2), TypeCase.New(a3) }, null); } .... obj.TypeSwitch( string str => hoge.Method1(str), int x => hoge.Method2(x), bool b => hoge.Method3(b), ...); 型によって分岐する。楽ちんだし安全。
こんな風に有用なメソッドがぼんぼん作れるのがC# 3.0の懐の深さですよ。