2011-11-11 21 views
54

この質問Passing DataContext into Action()の回答に関して、どのようにしてアクション(db)から値を返すのですか?Action()から値を返す方法は?

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

は、より多くのようにする必要があります:

MyType myType = SimpleUsing.DoUsing<MyType>(db => { 
// do whatever with db. query buit using db returns MyType. 
}); 

答えて

61

あなたの静的メソッドは、から行く必要があります:へ

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

public static class SimpleUsing 
{ 
    public static TResult DoUsing<TResult>(Func<MyDataContext, TResult> action) 
    { 
     using (MyDataContext db = new MyDataContext()) 
      return action(db); 
    } 
} 

この答えをので、私はコードを提供することができ、コメントの中から生まれました。完全な詳細については、@ sllの答えをご覧ください。

84

あなたはFunc<T, TResult>ジェネリックデリゲートを使用することができます。また、戻り値とみなし便利な汎用的な代表団がある

Func<MyType, ReturnType> func = (db) => { return new MyTytpe(); } 

MSDNを参照してください):

  • Converter<TInput, TOutput>MSDN
  • Predicate<TInput>を - 常にブール値を返します(MSDN

方法:

public MyType SimpleUsing.DoUsing<MyType>(Func<TInput, MyType> myTypeFactory) 

ジェネリックデリゲート

Func<InputArgumentType, MyType> createInstance = db => return new MyType(); 

実行します。

MyType myTypeInstance = SimpleUsing.DoUsing(
          createInstance(new InputArgumentType())); 

または明示的に:

MyType myTypeInstance = SimpleUsing.DoUsing(db => return new MyType()); 
+0

右のように、メソッドがどのように表示されるかの例を挙げることができますか? – 4thSpace

+0

私はこれがどのようにフィットするのかを追っていません。メソッドのシグネチャ(つまり、public static void DoUsing(アクションアクション))で表示できますか? @ L.B:はい - 私の投稿は結果です。 – 4thSpace

+3

@ L.B - 人々にGoogleを求めることは建設的ではありません。完全な回答を提供するために存在します。 –

11

ラムダまたは匿名のメソッドが、囲みスコープ内の変数を閉じることができるという事実を利用することもできます。

MyType result; 

SimpleUsing.DoUsing(db => 
{ 
    result = db.SomeQuery(); //whatever returns the MyType result 
}); 

//do something with result 
+0

ええ、これはClosureと呼ばれています(私たちのためにも利用可能なファンクション言語のもの) – sll

関連する問題