Pregunta

He escrito una clase de administración SessionItem simple para manejar todas esas verificaciones nulas molestas e insertar un valor predeterminado si no existe. Aquí está mi método 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];
}

Ahora, ¿cómo utilizo esto realmente, pasando el Func < T > como un parámetro de método en línea?

¿Fue útil?

Solución

Dado que es una función, una lambda sería la forma más sencilla:

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

Donde [new Foo (" blah ")] es la función que se invoca por defecto.

También puedes simplificar a:

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

¿Dónde? es el operador de unión nula: si el primer argumento no es nulo, se devuelve; de lo contrario, la mano derecha se evalúa y se devuelve (por lo que defaultValue () no se invoca a menos que el elemento sea nulo).

Finalmente, si solo quieres usar el constructor predeterminado, puedes agregar un " nuevo () " restricción:

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

Esto sigue siendo perezoso: el nuevo () solo se usa si el elemento era nulo.

Otros consejos

¿Por qué no pasas el valor predeterminado directamente? ¿De qué sirve el funtor?

Por cierto, defaultValue.Invoke () es bastante detallado. También es posible simplemente escribir defaultValue () .

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

Nota, de lo normal, puede omitir la especificación {T} en la llamada GetItem {T} (si Func {T} devuelve un objeto del mismo tipo)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top