как я могу разрешить C # добавлять структуры другого типа для добавления в список того же типа?

#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;
        }
    }