2011-11-11 17 views

risposta

61

tuo metodo statico dovrebbe andare da:

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

A:

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

Questa risposta è cresciuto di commenti così ho potuto fornire il codice. Per un'elaborazione completa, vedere la risposta di @ sll di seguito.

84

È possibile utilizzare Func<T, TResult> delegato generico. (Vedere MSDN)

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

Inoltre ci sono utili delegati generici che considera un valore di ritorno:

  • Converter<TInput, TOutput> (MSDN)
  • Predicate<TInput> - tornare sempre bool (MSDN)

Metodo:

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

delegato generico:

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

Esegui:

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

O esplicitamente:

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

Destra: puoi fornire un esempio di come dovrebbe essere il metodo? – 4thSpace

+0

Non seguo come questo si adatta. Potete mostrarlo con la firma del metodo (cioè pubblico statico vuoto DoUsing (Azione azione))? @ L.B: sì - il mio post è il risultato. – 4thSpace

+3

@ L.B - chiedere alle persone di google non è costruttivo. SO esiste per fornire risposte complete. –

11

È inoltre possibile sfruttare il fatto che un metodo lambda o anonimo può chiudere le variabili nel suo ambito di chiusura.

MyType result; 

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

//do something with result 
+0

sì, questo si chiama Closure (roba in linguaggio funcitonal che è disponibile anche per noi) – sll

Problemi correlati