Это сообщение основано в моем 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;
}
}
Моя цель состоит в том, чтобы создать «Pinboard», который может возвращать список плакатов. Каждый плакат может быть другого типа (например, плакат для животных, плакат с цветами и т. Д.). Каждый плакат имеет совершенно другой вид, содержание и так далее. Но все они унаследованы от класса BasePoster.
В общем, у меня будет около 100 различных типов плакатов. Конкретный экземпляр PinBoard может легко содержать 1000 плакатов и более разных плакатов (в разном порядке).
Чтобы заполнить плакаты определенного PinBoard, мне нужно передать PinBoard список определенных генераторов плакатов (количество и тип генераторов будут меняться в зависимости от контекста). Будет один плакат-генератор для каждого типа плаката (например, PetPosterGenerator, который генерирует коллекцию плакатов для домашних животных).
Я думал, что было бы неплохо, если бы все мои генераторы плакатов могли использовать один и тот же (тип безопасного) интерфейса. Вот почему я представил интерфейс IPosterGenerator.
Моя проблема заключается в том, что код не компилируется. Есть две ошибок компилятора с тем же сообщением об ошибке: Использование универсального типа «myApp.IPosterGenerator» требуют 1 аргументов типа
Я не удивлен сообщением об ошибке, потому что я не определения любого типа в этих местах. Было бы замечательно, если бы я мог сделать что-то подобное в строке первой ошибки:
protected List<IPosterGenerator<T>> PosterGenerators { get; set; }
Но когда я делаю это, компилятор не может найти тип или пространство имен Т.
Теперь я вид потерянного. Возможно, использование универсального интерфейса IPosterGenerator в конце концов не такая хорошая идея. Но я уверен, что в какой-то момент моего приложения мне нужно узнать или получить доступ к конкретному типу плаката, который представляет собой определенный IPosterGenerator.
Как вы, ребята, подходите к этому? Большое вам спасибо за вашу поддержку заранее.
причина вы получаете ошибку довольно очевидно. И один из способов решения этой проблемы, как и кто-то еще, опубликовал, чтобы создать не-общий интерфейс, который реализует общий. Но вам следует подумать над дизайном вашего решения! Там что-то не так. –
@Miky: Вы, вероятно, правы. Кроме того, я понятия не имею, что может быть «не так» ;-) – Ingmar
Проблема в том, что вы смешиваете кучу различных типов объектов «IPosterGenerator» в одну коллекцию. Вы, вероятно, не должны этого делать, потому что, как только вы это сделаете, вы по существу «потеряли» информацию об их общем аргументе. Вам нужно сделать шаг назад и подумать о том, что вам действительно нужно делать, а не как вам нужно это делать или как просто получить код для компиляции, потому что, хотя эти вопросы отвечают, они намного менее вероятны чтобы помочь вам. – Servy