У меня есть два небольших класса: Pet
и Book
каждый из которых имеет пару свойств и функцию с таким методом, как
public static List<T> GetSubSet<T>(List<T> incomingList)
{
var returnList = new List<T>();
Random r = new Random();
Console.WriteLine("Enter size of random subset: ");
int randomInt = 0;
int size = Convert.ToInt32(Console.ReadLine());
while (size > incomingList.Count)
{
Console.WriteLine("Size too large, enter smaller subset: ");
size = Convert.ToInt32(Console.ReadLine());
}
while (returnList.Count < size)
{
randomInt = r.Next(incomingList.Count);
if (!returnList.Contains(incomingList[randomInt]))
{
returnList.Add(incomingList[randomInt]);
}
}
return returnList;
}
который принимает общий список объектов и возвращает меньшее подмножество. Функция работает и может принимать объект Pet или Book. Я хотел бы использовать ту же функцию в списке, который содержит как Pet и бронирование типов. Лучший способ, которым я знаю, как это сделать, – это интерфейс (наследование здесь не имеет смысла).
interface ISubset<T>
{
IEnumerable<T> GetSubset();
}
Когда я реализую интерфейс в своем классе Pet, это выглядит
class Pet : ISubset<Pet>
В моем основном классе у меня есть список домашних животных и книг. Я хотел бы добавить оба этих списка в ISubset
объектов ISubset
чтобы я мог использовать функцию GetSubset для обоих. Однако я не могу объявить список, например
List<ISubset<T>> list = new List<ISubset<T>>();
Я получаю ошибку 'the type or namespace T could not be found
.
Как я могу объявить список объектов ISubset, когда интерфейс принимает общий тип?
Хорошо, у меня есть два списка:
List<Pet> petList = new List<Pet>();
petList.Add(new Pet() { Name = "Mr.", Species = "Dog" });
petList.Add(new Pet() { Name = "Mrs.", Species = "Cat" });
petList.Add(new Pet() { Name = "Mayor", Species = "Sloth" });
petList.Add(new Pet() { Name = "Junior", Species = "Rabbit" });
List<Book> bookList = new List<Book>();
bookList.Add(new Book() { Author = "Me", PageCount = 100, Title = "MyBook" });
bookList.Add(new Book() { Author = "You", PageCount = 200, Title = "YourBook" });
bookList.Add(new Book() { Author = "Pat", PageCount = 300, Title = "PatsBook" });
Какой должен быть тип, если я хочу добавить эти списки вместе в другой список?
Вы можете просто использовать List<object>
, но если вы хотите сделать это так, как вы предлагаете, вам нужно создать интерфейс с подписью, которая охватывает оба ваших класса
public interface IGen
{
int A;
int Method;
}
Затем наследуйте/реализуйте этот интерфейс в своих классах
public class Pet : IGen
{
public int A { get; set; }
private int Method(){ ... }
}
public class Book : IGen
{
public int A { get; set; }
private int Method(){ ... }
}
Затем вы можете перейти в свой GetSubSet
как
GetSubSet<IGen>(List<IGen> incomingList) { ... }
Надеюсь, это поможет.
List<object>
должен работать нормально.
В LinqPad было протестировано следующее:
void Main()
{
List<Pet> petList = new List<Pet>();
petList.Add(new Pet() { Name = "Mr.", Species = "Dog" });
petList.Add(new Pet() { Name = "Mrs.", Species = "Cat" });
petList.Add(new Pet() { Name = "Mayor", Species = "Sloth" });
petList.Add(new Pet() { Name = "Junior", Species = "Rabbit" });
List<Book> bookList = new List<Book>();
bookList.Add(new Book() { Author = "Me", PageCount = 100, Title = "MyBook" });
bookList.Add(new Book() { Author = "You", PageCount = 200, Title = "YourBook" });
bookList.Add(new Book() { Author = "Pat", PageCount = 300, Title = "PatsBook" });
List<object> both = petList.OfType<object>().Union(bookList.OfType<object>()).ToList().Dump();
}
// Define other methods and classes here
public class Pet
{
public string Name { get; set; }
public string Species { get; set; }
}
public class Book
{
public string Author { get; set; }
public int PageCount { get; set; }
public string Title { get; set; }
}