Можно ли уменьшить количество параметров типа?

Я нахожу, что это раздражает то, что нужно указать типы Foo и FooFactory в вызове RunTest ниже. В конце концов, если тест знает тип фабрики, подразумевается тип, создаваемый фабрикой. Предполагая, что я хочу запускать множество различных заводских тестов для фабрик разных классов, это много угловых скобок, и это становится хуже с более богатыми иерархиями типов. Мне интересно, можно ли реструктурировать это, чтобы тест был более кратким.

public class Foo
{
}

public interface IFactory<T>
{
    T Create();
}

public class FooFactory : IFactory<Foo>
{
    public Foo Create()
      => new Foo();
}

public class FactoryTest
{
    internal void RunTest<TFactory, T>(TFactory factory)
        where TFactory : IFactory<T>
    {
        T t = factory.Create();
        Assert.NotEqual(default(T), t);
    }

    [Fact]
    public void FooFactoryWorks()
    {
        RunTest<FooFactory, Foo>(new FooFactory());
    }
}

Ответы

Ответ 1

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

internal void RunTest<T>(IFactory<T> factory)
{
    T t = factory.Create();
    Assert.NotEqual(default(T), t);
}

Тогда вы можете просто использовать:

RunTest(new FooFactory());

поскольку Foo может быть выведен компилятором.