web-dev-qa-db-ja.com

タイプパラメータの数を減らすことはできますか?

以下のRunTestの呼び出しで、FooとFooFactoryの両方のタイプを指定する必要があるのは面倒です。結局のところ、テストがファクトリのタイプを知っている場合、ファクトリが作成しているタイプが暗示されます。さまざまなクラスのファクトリに対してさまざまなファクトリテストを実行したいとすると、それは多くの山かっこであり、より豊富なタイプ階層で悪化します。テストをより簡潔にするために、これを再構築することは可能かどうか疑問に思います。

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());
    }
}
18

TFactoryが型パラメータでなければならないことは明らかではありません。私はこれを書きます:

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

次に、次を使用できます。

RunTest(new FooFactory());

Fooは、コンパイラーによって推測できるためです。

53
Jon Skeet