2011-11-11 99 views

回答

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>泛型委託。 (見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()); 
+0

對 - 你能提供一個這個方法應該是什麼樣子的例子嗎? – 4thSpace

+0

我sitll不遵循如何適合英寸可以顯示它的方法簽名(即公共靜態無效DoUsing(動作行動))? @ L.B:是的 - 我的文章是結果。 – 4thSpace

+3

@ L.B--要求人們對谷歌沒有建設性。 SO存在以提供完整的答案。 –

11

您還可以利用lambda或匿名方法可以關閉其封閉範圍中的變量的事實。

MyType result; 

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

//do something with result 
+0

是的,這就是所謂的Closure(功能語言的東西,它也適用於我們) – sll