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?

È stato utile?

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)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top