如何从Action()返回值?

4th*_*ace 77 .net c# linq

关于这个问题的答案将DataContext传递给Action(),如何从action(db)返回一个值?

SimpleUsing.DoUsing(db => { 
// do whatever with db 
}); 
Run Code Online (Sandbox Code Playgroud)

应该更像是:

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

sll*_*sll 107

您可以使用Func<T, TResult>通用委托.(见MSDN)

Func<MyType, ReturnType> func = (db) => { return new MyType(); }
Run Code Online (Sandbox Code Playgroud)

还有一些有用的泛型委托,它们考虑了一个返回值:

  • Converter<TInput, TOutput>(MSDN)
  • Predicate<TInput>- 总是返回bool(MSDN)

方法:

public MyType SimpleUsing.DoUsing<MyType>(Func<TInput, MyType> myTypeFactory)
Run Code Online (Sandbox Code Playgroud)

通用代表:

Func<InputArgumentType, MyType> createInstance = db => return new MyType();
Run Code Online (Sandbox Code Playgroud)

执行:

MyType myTypeInstance = SimpleUsing.DoUsing(
                            createInstance(new InputArgumentType()));
Run Code Online (Sandbox Code Playgroud)

或明确:

MyType myTypeInstance = SimpleUsing.DoUsing(db => return new MyType());
Run Code Online (Sandbox Code Playgroud)

  • @LB - 它最好是完整的.我发现你的比喻是虚假的. (8认同)
  • @LB--要求人们谷歌是没有建设性的.存在提供完整答案. (5认同)
  • @KirkWoll但答案给出**成分**,它没有被**煮** (5认同)
  • @LB,最好不要发表评论,因为您没有添加任何价值。 (3认同)
  • @ 4thSpace,回答是为了提供代码. (2认同)

Kir*_*oll 84

你的静态方法应该来自:

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

至:

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

这个答案源于评论,所以我可以提供代码.有关详细说明,请参阅下面的@sll的答案.


Ste*_*ham 13

您还可以利用lambda或匿名方法可以关闭其封闭范围中的变量这一事实.

MyType result;

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

//do something with result
Run Code Online (Sandbox Code Playgroud)


Uly*_*ves 13

使用Func<T>而不是Action<T>.

Action<T>就像一个带有 T 类型参数的 void 方法,而Func<T>像一个没有参数的函数一样工作,它返回一个 T 类型的对象。

如果您希望为函数提供参数,请使用Func<TParameter1, TParameter2, ..., TReturn>.