2013-02-18 56 views
2

我试图将多个通用接口作为参数传递给我的某个类的构造函数。将多个通用接口传递给方法

下面的代码无法编译:

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

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

我有一百个不同类型的海报发电机。它们都从IPosterGenerator接口继承。当我实例化一个新的插件板时,我需要将三个IPosterGenerator传递给插件板的构造函数。但是,这三种IPosterGenerators都是不同类型的。这就是为什么我想出了这个愚蠢的A,B和C.

这可以完成吗?

+0

您是说A,B和C类只存在,以便您可以将三个IPosterGenerator参数传递给构造函数? – Maciej 2013-02-18 17:30:11

+0

否否。我有大约一百个班级(如A,B和C)。 – Ingmar 2013-02-18 17:34:29

回答

6

这听起来像你可能想使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); 
+0

哦,好的。但是如果我需要一个带有4个发生器的构造函数呢?或者可能是一整套发电机?对不起,我还不够精确...... – Ingmar 2013-02-18 17:33:21

+0

@IngmarBode那么,除非他们具有相同的类型或[有用的]通用基本类型,否则他们将无法全部处于集合中。 – Servy 2013-02-18 17:38:57

+0

好吧,明白了。感谢你们所有人。这很快:-) – Ingmar 2013-02-18 17:41:49

1

你必须让你的类声明为A,B & C。这样的事情:

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

对不起,因为我的原始问题不够精确。以下是我认为是好的,我(和我需要足够的灵活性):再次

public interface IPosterGenerator 
{ 
} 

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

public class Pinboard 
{ 
    public Pinboard(List<IPosterGenerator> generators) 
    { 

    } 
} 

感谢您的支持,伙计们!

+0

好吧,不。我错了。不适合我。我建立了一个全新的问题:http://stackoverflow.com/questions/14962110/use-a-list-of-generic-interfaces – Ingmar 2013-02-19 16:15:57

相关问题