Избегайте дублирования кода при специализации универсального - PullRequest
2 голосов
/ 26 апреля 2020

У меня есть обобщенный c метод, который выглядит примерно так:

void Foo<A, B>()
{
    // Do some stuff with B, some  conditionals, etc, e.g.:
    using (var scope = _provider.CreateScope())
    {
        var service = scope.ServiceProvider.GetService<B>();
        A result = service.Bar<A>();
    }
    // Do some more stuff with B
}

Теперь я хотел бы использовать вторую специализированную версию Bar, которая имеет другой тип возвращаемого значения, что-то вроде следующее:

void Foo<A, B>() where A : List<A>
{
    // Do the exact same stuff with B
    List<A> result = service.Bar2<A>();
    // Do other same stuff with B
}

Методы Bar могут выглядеть примерно так:

A Bar<A>()
{
    return new A();
}

List<A> Bar2<A>()
{
    return new List<A>();
}

Есть ли что-то, что я могу сделать, не имея всего дублированного кода, окружающего вызовы Bar ? Могу ли я использовать что-то вроде Func в качестве параметра? Должен ли я отказаться от использования дженериков здесь и попытаться использовать полиморфизм?

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