Передача нового экземпляра типа через универсальный метод - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть ряд очень похожих методов:

    private static DocumentBody GetPdfBodyObject(int sectionId)
    {
        DocumentBody db = new DocumentBody();
        // Add some stuff to Db
        return db;
    }

    private static DocumentHeader GetPdfHeaderObject(int sectionId)
    {
        DocumentHeader dh = new DocumentHeader();
        // Add some stuff to DH - similar to above
        return dh;
    }

И так далее ...

Как вы можете видеть, разница между этими двумя примерами основана на типе, которыйсоздание экземпляра и его возвращение.

Так что я сразу же подумал об использовании универсального метода для уменьшения дублирования кода ... Кажется, я просто не могу понять, какой путь является «лучшей практикой», и могу ли я получить то, что мне нужнобез рефлексии?

Я вообще почти не пользовался общими методами, поэтому любые советы приветствуются.

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Лучшей практикой здесь будет рефакторинг статических методов к фабричным методам или использование шаблона компоновщика , если вы строите объект большего размера (что, похоже, имеет место).Использование универсальных методов здесь будет ограничено конструкторами без параметров - всякий раз, когда конструктор будет принимать параметры, вам нужно будет использовать активатор, который является отражением, и вы обычно не хотите такого кода.Сказав, что: два метода, которые вы дали, конструируют объекты, используя конструкторы без параметров, так что вы можете рефакторинг как:

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 - в этом случае вы можете использовать только то,часть контракта (предложение , где ) - так что вам нужно будет реализовать некоторый «универсальный» интерфейс для всех созданных типов - и вы будете ограничены методами из интерфейса.Похоже, что вы находитесь в классической ситуации, когда используете шаблон строителя.

0 голосов
/ 28 ноября 2018

Что касается меня, интерфейсы хороши:

private interface IDocumentPart
{
}

private class DocumentHeader : IDocumentPart
{
}

private class DocumentBody : IDocumentPart
{
}

private static T GetPdfPart<T>(int sectionId) where T : IDocumentPart, new()
{
       var doc = new T();
       return doc;
}

Конечно, вы можете определить некоторые свойства и методы, общие для всех ваших классов в интерфейсе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...