#c# #.net #dynamic-data
#c# #.net #динамические данные
Вопрос:
у меня есть List<animal>
где я хочу добавить всех животных, их даже я могу добавить их или добавить их весь список.
как я могу сделать что-то, что они позволяют добавлять List<rat>
или rat
их — это не единственное, что мне нужно, чтобы добавить в него любой тип animal.
означает, что я могу разрешить оба
List<animal> animal = new List<animal>();
animal.Add(new rat());
animal.Add(new List<Elephant>());
мне нужно еще кое-что, чтобы all animal — это все animal, найденные в списке animal. мне не нужно считать все объекты, мне нужно посчитать каждого животного, которое добавляет отдельно или добавляет весь список.
Кто-нибудь может объяснить код на C #.
Ответ №1:
List<animal> animal = new List<animal>();
animal.Add(new Animal());
animal.AddRange(new List<animal>());
Конечно, если типы, которые вы хотите добавить, не имеют общего базового родителя, вы не можете использовать универсальный список. Вы могли бы использовать ArrayList, который позволяет хранить любые типы.
Обновить:
Если Rat
и Elephant
оба являются производными от Animal
, вы всегда можете сделать
List<animal> animal = new List<animal>();
animal.Add(new Rat());
И в .NET 4.0 благодаря общей ковариации вы также можете сделать:
animal.AddRange(new List<Elephant>());
но не в предыдущих версиях фреймворка.
Комментарии:
1. я допускаю ошибку при задании вопроса. итак, проверьте обновление, которое я сделал в вопросе.
2. @Moby, если
Rat
иElephant
оба являются производными отAnimal
, вы всегда можете сделатьlist.Add(new Rat());
. И в .NET 4.0 благодаря общей ковариации вы также можете это сделатьlist.AddRange(new List<Elephant>());
, но не в предыдущих версиях фреймворка.3. @Darin: Если бы, например, IAnimal был реализован в Rat и Elephant, не могли бы вы объявить
List<IAnimal>
? Что, если бы это был абстрактный класс Animal, такой какclass Elephant : Animal
?4. @Sergio, да, ты можешь объявить
List<IAnimal>
. То же самое, еслиAnimal
был абстрактный класс: вы можете иметьList<Animal>
.5. @Darin: Спасибо. 🙂 Тогда я поддерживаю идею использования абстрактного класса. 1 вам.
Ответ №2:
Для вашего примера с двумя разными видами животных, я думаю, что базовый класс animal имеет смысл и выводит отдельный класс для Elephant и Animal. Менее новый подход, хотя и выполнимый, заключается в создании общего списка объектов. Не уверен, что это за проект, поэтому в зависимости от ситуации вам нужно будет выбрать реализацию для использования. Добавьте каждый объект в общий список и проверьте тип, прежде чем использовать его с помощью метода GetType ().
Однако вот пример использования производного класса. Вы могли бы изменить базовый класс на интерфейсный или абстрактный класс, как обсуждалось выше. Вскоре я приведу пример использования универсальных объектов.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// Using derived way.
List<Animal> animals = new List<Animal>();
animals.Add(new Rat("the rat's name"));
animals.Add(new Elephant("the elephant's name"));
foreach (Animal a in animals)
{
Console.WriteLine(
string.Format("Name of animal: {0}"), a.Name));
}
}
}
public class Animal
{
public Animal(string name)
{
this.Name = name;
}
public string Name
{
get;
private set;
}
}
public class Elephant : Animal
{
public Elephant(string name)
:base(name)
{
}
public string AnimalProps
{
get;
set;
}
}
public class Rat :Animal
{
public Rat(string name)
:base(name)
{
}
public string RatProps
{
get;
set;
}
}
Ответ №3:
Вот пример использования списка объектов. Я бы не советовал эту реализацию, поскольку обычно базовый / абстрактный / интерфейсный класс и производные классы более чистые, хотя я видел случаи, когда требуется что-то подобное.
public Form2()
{
InitializeComponent();
List<object> objects = new List<object>();
objects.Add(new Rat("the rat's name"));
objects.Add(new Elephant("the elephant's name"));
foreach (object o in objects)
{
if(o.GetType() == typeof(Rat))
{
Rat r = o as Rat;
Console.WriteLine(
string.Format("Name of rat: {0}", r.Name));
}
else if(o.GetType() == typeof(Elephant))
{
Elephant e = o as Elephant;
Console.WriteLine(
string.Format("Name of elephant: {0}", e.Name));
}
}
}
public class Elephant
{
public Elephant(string name)
{
this.Name = name;
}
public string Name
{
get;
private set;
}
public string AnimalProps
{
get;
set;
}
}
public class Rat
{
public Rat (string name)
{
this.Name = name;
}
public string Name
{
get;
private set;
}
public string RatProps
{
get;
set;
}
}