Question

J'ai écrit une simple classe de gestion SessionItem pour gérer toutes ces vérifications nulles et insérer une valeur par défaut s'il n'en existe aucune. Voici ma méthode 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];
}

Maintenant, comment puis-je l'utiliser, en passant dans le fichier Func < T > comme paramètre de méthode en ligne?

Était-ce utile?

La solution

Puisqu'il s'agit d'une fonction, un lambda serait le moyen le plus simple:

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

Où [new Foo ("blah")] est la fonction invoquée par défaut.

Vous pouvez également simplifier pour:

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

Où ?? est l'opérateur de coalescence nulle - si le premier argument est non nul, il est renvoyé; sinon, la main droite est évaluée et renvoyée (ainsi, defaultValue () n’est pas appelé à moins que l’élément ne soit null).

Enfin, si vous souhaitez simplement utiliser le constructeur par défaut, vous pouvez ajouter un " new () " contrainte:

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

Ceci est toujours paresseux - la nouvelle () n'est utilisée que si l'élément était null.

Autres conseils

Pourquoi ne transmettez-vous pas la valeur par défaut directement? A quoi sert le foncteur?

Au fait, defaultValue.Invoke () est assez détaillé. Il est également possible d'écrire simplement defaultValue () .

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

Remarque, , vous pouvez ignorer normalement la spécification {T} dans l'appel GetItem {T} (si Func {T} renvoie un objet du même type)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top