Pergunta

Eu escrevi uma classe de gerenciamento SessionItem simples para lidar com todos aqueles inconvenientes verificações nulos e inserir um valor padrão se não existir nenhum. Aqui é o meu 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];
}

Agora, como posso realmente usar este, passando o Func como um parâmetro do método em linha?

Foi útil?

Solução

Uma vez que é um func, a lambda seria a maneira mais simples:

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

Onde [new Foo ( "blah")] é o func que é invocado como um padrão.

Você também poderia simplificar a:

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

Onde ?? é o operador coalescentes nulo - se o primeiro argumento não é nulo, ele é retornado; caso contrário, a mão direita é avaliado e devolvido (tão defaultValue () não é chamado a menos que o item é null).

Finalmente, se você só quer usar o construtor padrão, então você pode adicionar um "new ()" restrição:

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

Este é ainda preguiçosa -. A nova () é usado apenas se o item foi nula

Outras dicas

Por que você não passar o valor padrão diretamente? O que uso é o functor?

A propósito, defaultValue.Invoke() é bastante detalhado. Também é possível apenas defaultValue() escrita.

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

Note, do que normalmente você pode pular {T} especificação na {T} chamada GetItem (se Func {T} retorna objeto do mesmo tipo)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top