这篇文章基于我昨天的original post。但是我对我的需求不够精确,所以我会在这里再试一次。使用通用接口列表
请参阅我当前的代码:
public interface IPosterGenerator<T>
{
IQueryable<T> GetPosters();
}
public class PetPosterGenerator : IPosterGenerator<PetPoster>
{
IQueryable<PetPoster> GetPosters()
{
return busLogic.GetPetPosters();
}
}
public class FlowerPosterGenerator : IPosterGenerator<FlowerPoster>
{
IQueryable<FlowerPoster> GetPosters()
{
return busLogic.GetFlowerPosters();
}
}
public class PinBoard
{
protected List<IPosterGenerator> PosterGenerators { get; set; } // 1. compiler error
public PinBoard(List<IPosterGenerator> generators) // 2. compiler error
{
this.PosterGenerators = generators;
}
public List<BasePoster> GetPosters()
{
var posters = new List<BasePoster>();
foreach (var generator in PosterGenerators)
{
posters.Add(generator.GetPosters());
}
return posters;
}
}
我的目标是创建一个“通知板”,它可以返回海报列表。每张海报可以是不同类型的(例如宠物海报,花海报等)。每张海报都有完全不同的外观,内容等等。但他们都继承了BasePoster类。
总而言之,我将有大约100种不同类型的海报。一个具体的PinBoard实例可以很容易地包含1000张海报和更多不同种类的海报(按照不同的顺序)。
为了填充某个PinBoard的海报,我需要给PinBoard提供一些海报生成器的列表(生成器的数量和类型将根据上下文而改变)。每个海报类型将会有一个海报生成器(例如,生成宠物海报的PetPosterGenerator)。
我认为这将是很好,如果我所有的海报生成器可以共享相同的(类型安全)接口。这就是我介绍IPosterGenerator接口的原因。
我的问题是代码不能编译。有两种编译器错误具有相同的错误消息:使用泛型类型“myApp.IPosterGenerator”需要1个类型参数
,因为我不定义任何类型的在这些位置,我没有错误消息感到惊讶。这将是巨大的,如果我能在第一个错误的线路做这样的事情:
protected List<IPosterGenerator<T>> PosterGenerators { get; set; }
但是当我这样做,编译器无法找到类型或命名空间T.现在
我有点失落。毕竟,使用通用的IPosterGenerator接口可能不是一个好主意。但我确信,在我的应用程序中的某个时刻,我需要知道或访问某个IPosterGenerator所代表的具体海报类型。
你们会怎么做?非常感谢您提前给予您的支持。
你得到错误的原因是很明显的。还有一种方法可以像其他人已经发布的那样来解决它,以创建一个通用接口来实现非通用接口。但是您应该考虑解决方案的整体设计!有什么不对吗.. – 2013-02-19 16:19:32
@Miky:你可能是对的。除此之外,我不知道什么可能“不正确”;-) – Ingmar 2013-02-19 16:23:35
问题是,您正在将一堆不同类型的'IPosterGenerator'对象混合到一个集合中。你可能不应该这样做,因为一旦你这样做了,你基本上“失去”了关于他们的一般论证的信息。你需要退后一步,思考你真正需要做的事情,而不是你需要做什么或者如何让代码编译,因为虽然这些问题是可以回答的,但它们的可能性很小真正帮助你。 – Servy 2013-02-19 16:25:12