2011-11-11 11 views

Respuesta

61

Su método estático debe ir de:

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

Para:

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

Esta respuesta surgió de comentarios para que pudiera proporcionar el código. Para una elaboración completa, consulte la respuesta de @ sll a continuación.

84

Usted puede utilizar Func<T, TResult> delegado genérico. (Ver MSDN)

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

También hay delegados genéricos útiles que considera un valor de retorno:

  • Converter<TInput, TOutput> (MSDN)
  • Predicate<TInput> - siempre volver bool (MSDN)

Método:

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

delegado Genérico:

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

ejecutar:

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

o explícitamente:

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

Derecho - ¿Puede darnos un ejemplo de cómo debería ser el método? – 4thSpace

+0

No me pregunto cómo encaja esto. ¿Se puede mostrar con la firma del método (es decir, público está vacío DoUsing (Acción))? @ L.B: sí, mi publicación es el resultado. – 4thSpace

+3

@ L.B: pedirle a las personas que busquen en google no es constructivo. SO existe para proporcionar respuestas completas. –

11

También puede aprovechar el hecho de que un método lambda o anónimo puede cerrar sobre las variables en su ámbito adjunto.

MyType result; 

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

//do something with result 
+0

sí, esto se llama Cierre (material de lenguaje funcional que también está disponible para nosotros) – sll

Cuestiones relacionadas