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