俺のライブラリを見せてやる

 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の懐の深さですよ。