如何从Action()返回值?

关于这个问题的答案将DataContext传递到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. }); 

你的静态方法应该从:

 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的答案。

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

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

还有一些有用的通用代表,它们会考虑返回值:

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

您也可以利用lambda或匿名方法可以closures其封闭范围中的variables的事实。

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