c# - 将多个通用接口(interface)传递给一个方法

标签 c# generics

我试图将多个通用接口(interface)作为参数传递给我的一个类的构造函数。

以下代码无法编译:

public interface IPosterGenerator<T>
{
    IQueryable<T> GetPosters();
}

public class Pinboard
{
    public Pinboard(IPosterGenerator<A> firstPosterGenerator, IPosterGenerator<B> secondPosterGenerator, IPosterGenerator<B> thirdPosterGenerator)
    { 
    }
}

我有大约一百种不同类型的海报生成器。它们都继承自 IPosterGenerator 接口(interface)。当我实例化一个新的 Pinboard 时,我需要将三个 IPosterGenerators 传递给 Pinboard 的构造函数。但是,这三个 IPosterGenerator 中的每一个都属于不同的类型。这就是我想出这个愚蠢的 A、B 和 C 的原因。

这完全可以做到吗?

最佳答案

听起来你可能想让 Pinboard 通用:

public class Pinboard<T1, T2, T3>
{
    public Pinboard(IPosterGenerator<T1> generator1,
                    IPosterGenerator<T2> generator2,
                    IPosterGenerator<T3> generator3)
    {
         ...
    }
}

为了方便调用,可以创建一个带有泛型方法的非泛型类:

public static class Pinboard
{
    public static Pinboard<T1, T2, T3> Create(IPosterGenerator<T1> generator1,
                                              IPosterGenerator<T2> generator2,
                                              IPosterGenerator<T3> generator3)
    {
        return new Pinboard<T1, T2, T3>(generator1, generator2, generator3);
    }
}

然后如果你已经有了生成器,你可以调用:

// Or whatever...
var board = Pinboard.Create(bigGenerator, smallGenerator, mediumGenerator);

关于c# - 将多个通用接口(interface)传递给一个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14941947/

相关文章:

c# - 有谁知道为什么我从 NHibernate/NH Profiler 收到这个警告?

Scala 泛型类型推断与 ClassTag 不一致

Java:如何传递代表 Enum 类的值?

c# - 是否可以将强类型数组绑定(bind)为 ASP.NET Core 中的配置模型?

c# - 在单独的项目中使用 EF 核心设置多个项目

c# - System.String 没有实现接口(interface) System.IConvertible

c# - 在 Unity 中使用泛型作为变量类型

c# - 为什么在没有 new() 泛型类型约束的情况下允许 Activator.CreateInstance<T>() ?

delphi - 在 Delphi 中强制转换泛型安全吗?

c# - 异步执行方法的最快方法?