ob_
Так как это - func, лямбда была бы самым простым путем:
Foo foo = GetItem<Foo>("abc", () => new Foo("blah"));
Где [новый Foo ("вздор")] является func, который вызывается как значение по умолчанию.
Вы могли также упростить до:
return ((T)HttpContext.Current.Session[key]) ?? defaultValue();
Где?? объединяющий пустой указатель оператор - если первый аргумент является непустым, он возвращается; иначе правая рука оценена и возвращена (таким образом, defaultValue () не вызывается, если объект не пустой).
Наконец, если Вы просто хотите использовать конструктора по умолчанию, затем Вы могли бы добавить "новый ()" ограничение:
public static T GetItem<T>(string key)
where T : new()
{
return ((T)HttpContext.Current.Session[key]) ?? new T();
}
Это все еще лениво - новое () только используется, если объект был пустым.
var log = SessionItem.GetItem("logger", () => NullLog.Instance)
Отметьте, чем обычно Вы может пропустить спецификацию {T} в вызове GetItem {T} (если Func {T} возвращает объект того же типа),
Почему Вы не передаете значение по умолчанию непосредственно? Какое использование является функтором?
Между прочим, defaultValue.Invoke()
является довольно подробным. Также возможно просто записать defaultValue()
.