Frage

Ich habe eine einfache SessionItem-Management-Klasse geschrieben, um alle diese lästigen null Kontrollen zu umgehen und einen Standardwert ein, wenn keiner vorhanden ist. Hier ist meine GetItem Methode:

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];
}

Nun, wie kann ich dies auch tatsächlich nutzen, in der Func vorbei als Inline-Methodenparameter?

War es hilfreich?

Lösung

Da, dass eine func ist, eine Lambda wäre der einfachste Weg sein:

Foo foo = GetItem<Foo>("abc", () => new Foo("blah"));

Wo [new Foo ( "blah")] ist die func, der als Standard aufgerufen wird.

Sie können auch vereinfachen zu:

return ((T)HttpContext.Current.Session[key]) ?? defaultValue();

Wo ?? Operator ist der null-Koaleszenz - wenn der erste nicht-Arg- null ist, wird es zurückgegeben; sonst wird die rechte Hand wird ausgewertet und zurückgegeben (so default () nicht aufgerufen wird, wenn der Punkt null ist).

Schließlich, wenn Sie nur den Standard-Konstruktor verwenden möchten, dann könnte man eine „neue ()“ Einschränkung hinzufügen:

public static T GetItem<T>(string key)
    where T : new()
{
    return ((T)HttpContext.Current.Session[key]) ?? new T();
}

Dies ist immer noch faul -. Die neue () wird nur verwendet, wenn das Element null war

Andere Tipps

Warum Sie den Standardwert nicht direkt übergeben? Was nützt der Funktors?

By the way, ist defaultValue.Invoke() recht ausführlich. Es ist auch möglich, nur defaultValue() zu schreiben.

var log = SessionItem.GetItem("logger", () => NullLog.Instance)

Hinweis als normalerweise können Sie überspringen {T} Spezifikation in der GetItem {T} Anruf (wenn Func {T} gibt Objekt des gleichen Typs)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top