c# - 可以减少类型参数的数量吗?

标签 c# type-parameter

我觉得很烦人,因为必须在下面对 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());
    }
}

最佳答案

不清楚 TFactory 是否必须是类型参数。我会这样写:

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

然后你就可以使用:

RunTest(new FooFactory());

因为 Foo 可以被编译器推断出来。

关于c# - 可以减少类型参数的数量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48287459/

相关文章:

c# - 如何在 C# 中将数组添加到 SQL 行?

c# - 如何使用 C# 访问另一个 Windows 窗体中的对象?

scala - Scala类型系统:基本类型不匹配

c# - 接口(interface)作为类型约束和接口(interface)作为参数之间的区别?

java - Wild FJ 论文中类型变量和类型参数的区别?

scala - Spark 对象的类型参数边界很难获得

c# - ClassName<T =""> 的含义和使用方法

c# - 如何在 WEB API 中格式化 HttpResponseMessage 中的列表

c# - Visual Studio 2013 远程调试、自动部署?

java - Scala:使用类型参数信息访问静态 Java 方法