Action()から値を返す方法は?


92

この質問に対する回答について、DataContexting to Action()、action(db)から値を返すにはどうすればよいですか?

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

もっと似ているはずです:

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

回答:


97

あなたの静的メソッドは次のようになります:

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の回答を参照してください。


113

Func<T, TResult>汎用デリゲートを使用できます。(MSDNを参照)

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

また、戻り値を考慮する便利なジェネリックデリゲートもあります。

  • 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());

右-メソッドがどのように見えるかの例を提供できますか?
4thSpace

5
@LB-グーグルに人々に尋ねることは建設的ではありません。SOは完全な答えを提供するために存在します。
カークウォル

5
@KirkWollしかし、答えは成分を示していますが、調理され
LB

9
@LB-完全である方が良いです。私はあなたの類推を疑わしいと思います。
カークウォル

1
@LB、これまで何の価値も追加していないので、コメントしない方が良い。
4thSpace

15

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

MyType result;

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

//do something with result

ええ、これはクロージャーと呼ばれます(私たちも利用できる機能的な言語のもの)
sll

4

Func<T>よりも使用してくださいAction<T>

Action<T>T型のパラメーターを持つvoidメソッドのように動作し、パラメーターなしでT Func<T>型のオブジェクトを返す関数のように機能します。

関数にパラメーターを指定する場合は、を使用しますFunc<TParameter1, TParameter2, ..., TReturn>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.