Вам нужно добавить
where T : class
к объявлению вашего метода, например
T Execute<T>() where T : class
{
Кстати, в качестве предположения, что универсальная обертка действительно не добавляет особой ценности. Звонящий может написать:
MyClass c = whatever.Execute() as MyClass;
Или, если они хотят бросить при неудаче:
MyClass c = (MyClass)whatever.Execute();
Общий метод-оболочка выглядит следующим образом:
MyClass c = whatever.Execute<MyClass>();
Все три версии должны указывать одни и те же три сущности, только в разных порядках, поэтому ни одна из них не является более простой или более удобной, и все же общая версия скрывает то, что происходит, тогда как каждая из «сырых» версий проясняет это. будет ли бросок или null
.
(Это может быть неуместно для вас, если ваш пример упрощен от вашего фактического кода).