C # - Como faço para definir um método em linha Func como um parâmetro?
-
03-07-2019 - |
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
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)