C # - Come definisco un metodo in linea Func < T > come parametro?
-
03-07-2019 - |
Domanda
Ho scritto una semplice classe di gestione SessionItem per gestire tutti quei fastidiosi controlli null e inserire un valore predefinito se non esiste. Ecco il mio metodo GetItem:
public static T GetItem<T>(string key, Func<T> defaultValue)
{
if (HttpContext.Current.Session[key] == null)
{
HttpContext.Current.Session[key] = defaultValue.Invoke();
}
return (T)HttpContext.Current.Session[key];
}
Ora, come posso effettivamente utilizzarlo, passando per Func < T > come parametro del metodo inline?
Soluzione
Dal momento che questa è una funzione, un lambda sarebbe il modo più semplice:
Foo foo = GetItem<Foo>("abc", () => new Foo("blah"));
Dove [new Foo (" blah ")] è la funzione che viene invocata come predefinita.
Puoi anche semplificare a:
return ((T)HttpContext.Current.Session[key]) ?? defaultValue();
Dove ?? è l'operatore a coalescenza nulla - se il primo argomento non è null, viene restituito; altrimenti la mano destra viene valutata e restituita (quindi defaultValue () non viene invocato a meno che l'articolo sia nullo).
Infine, se vuoi solo usare il costruttore predefinito, puoi aggiungere un " new () " vincolo:
public static T GetItem<T>(string key)
where T : new()
{
return ((T)HttpContext.Current.Session[key]) ?? new T();
}
Questo è ancora pigro: il nuovo () viene utilizzato solo se l'elemento era null.
Altri suggerimenti
Perché non passi direttamente il valore predefinito? A che serve il funzione?
A proposito, defaultValue.Invoke ()
è abbastanza dettagliato. È anche possibile scrivere defaultValue ()
.
var log = SessionItem.GetItem("logger", () => NullLog.Instance)
Nota di quanto normalmente si possa saltare la specifica {T} nella chiamata GetItem {T} (se Func {T} restituisce un oggetto dello stesso tipo)