我如何允许C#添加另一种类型的结构来添加或添加相同类型的列表?

时间:2011-04-10 14:47:51

标签: c# .net dynamic-data

我有List<animal>我希望添加所有动物,即使我可以添加它们或添加它们整个列表。

我如何做一些他们允许添加List<rat>rat的东西,他们不仅需要在其中添加任何类型的动物。

意味着我可以同时允许

List<animal> animal  = new List<animal>();

animal.Add(new rat());
animal.Add(new List<Elephant>());

我需要更多的东西,所有的动物都是动物名单中的动物。我不需要计算我需要计算的所有对象每个分别添加或添加整个列表的动物。

有人可以用C#解释代码吗?

3 个答案:

答案 0 :(得分:1)

List<animal> animal  = new List<animal>();
animal.Add(new Animal());
animal.AddRange(new List<animal>());

当然,如果您愿意添加的类型没有公共基本父级,则不能使用通用列表。您可以使用允许存储任何类型的ArrayList


更新:

如果RatElephant都来自Animal,您可以随时

List<animal> animal  = new List<animal>();
animal.Add(new Rat());

在.NET 4.0中,由于通用的协方差,你也可以这样做:

animal.AddRange(new List<Elephant>()); 

但不在以前版本的框架中。

答案 1 :(得分:0)

对于你有两种不同动物的例子,我认为动物的基类是有意义的,并为大象和动物衍生出一个单独的类。一种不那么新颖的方法,虽然可行但是创建一个通用的对象列表。不确定您的项目是什么,因此根据具体情况,您需要选择要使用的实现。将每个对象添加到通用列表中,并在使用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;
    }
}

答案 2 :(得分:0)

这是使用对象列表的示例。我建议不要使用这个实现,因为通常基础/抽象/接口类和派生类更清晰,尽管我已经看到需要这样的东西的情况。

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