Лучшей практикой здесь будет рефакторинг статических методов к фабричным методам или использование шаблона компоновщика , если вы строите объект большего размера (что, похоже, имеет место).Использование универсальных методов здесь будет ограничено конструкторами без параметров - всякий раз, когда конструктор будет принимать параметры, вам нужно будет использовать активатор, который является отражением, и вы обычно не хотите такого кода.Сказав, что: два метода, которые вы дали, конструируют объекты, используя конструкторы без параметров, так что вы можете рефакторинг как:
private static TT GetPdfObjectPart<TT>(int sectionId) where TT : class, new()
{
TT dh = new TT();
// Add some stuff to DH - similar to above
return dh;
}
Также обратите внимание, что, как указал @dymanoid - в этом случае вы можете использовать только то,часть контракта (предложение , где ) - так что вам нужно будет реализовать некоторый «универсальный» интерфейс для всех созданных типов - и вы будете ограничены методами из интерфейса.Похоже, что вы находитесь в классической ситуации, когда используете шаблон строителя.