2011-11-11 6 views
0

の代わりにやって渡す:)私はアクションを(使用したい行動にDataContextの()

using(MyDataContext db = new MyDataContext()) 
{ 
    //do something 
} 

SimpleUsing.DoUsing(() => 
{ 
    //but how to get DataContext variable? 
} 

として使用される

public static class SimpleUsing 
{ 
    public static void DoUsing(Action action) 
    { 
    using(MyDataContext db = new MyDataContext()) 
    { 
     //do something 
    } 
    } 
} 

主な問題は、 "db"変数にアクセスしてDataContextを使用する方法です。

答えて

7

汎用タイプAction<T1>,Action<T1, T2>などは、いくつかの引数を取るデリゲートを定義します。だからこのように書くことができます:

public static class SimpleUsing 
{ 
    public static void DoUsing(Action<MyDataContext> action) 
    { 
     using (MyDataContext db = new MyDataContext()) 
      action(db); 
    } 

    public static T DoUsing(Func<MyDataContext, T> fn) 
    { 
     using (MyDataContext db = new MyDataContext()) 
      return fn(db); 
    } 
} 

// ... 

SimpleUsing.DoUsing(db => { 
    // do whatever with db 
}); 

var result = SimpleUsing.DoUsing(db => { 
    return 42; // uses Func overload, result will be 42 
}); 
+0

優れています。ありがとう。私はこのタイプをどのように返すことができるかも知っていますか?これはDoUsingを汎用メソッドにします(Tを返します)。 – 4thSpace

+0

私は値を返すためにFunc <>を使う必要があると思います。 – TGnat

+0

@TGnat、あなたはそれがどのように見えるか考えていますか?それは行動から外れて方法に戻る必要があります。 – 4thSpace