如何在C#中的通用列表中存储不同类型的对象

时间:2016-10-03 04:09:54

标签: c# generics

我需要添加不同类型的对象(即使它们不同,它们共享相同的基类,它们是兄弟姐妹。

考虑这个类层次结构

public abstract class Fruit
{
    public int Quality { get; set; }

    public string Name { get; set; }

}

public sealed class Apple :Fruit
{
    public string Color { get; set; }

    public Apple(string color ="Red")
    {
        Color = color;
    }
}

public sealed class Orange : Fruit
{
    public Orange(string type = "WithSeed")
    {
        Type = type;
    }
    public string Type { get; set; }
}

我该怎么做呢

_apples = new List<Apple>
        {
            new Apple
            {
                Name = "Fiji Apple",
                Quality = 9,
                Color ="Green"
            },
            new **Orange**
            {
                Name = "Indi Orange",
                Quality = 7,
            }
        };

此通用列表的使用者将使用基类使用它。例如:使用IEnumerable<Fruit>。 有人可以建议吗?

6 个答案:

答案 0 :(得分:2)

列出Fruit。这样,列表将包含任何Fruit对象以及从Fruit继承的任何类型的对象。

List<Fruit> _list = new List<Fruit>
{
    new Apple
    {
        Name = "Fiji Apple",
        Quality = 9,
        Color ="Green"
    },
    new Orange
    {
        Name = "Indi Orange",
        Quality = 7
    }
};

答案 1 :(得分:1)

列表必须始终知道它包含哪种类型。因此,为了使其包含AppleOrange,您必须将列表定义为包含任何超级类或接口,以涵盖您希望放入列表中的所有项目。

在这种情况下,这会使List<Fruit>List<object>包含两者。

答案 2 :(得分:0)

为此目的使用类层次结构是一个常见的错误。 有一个接口并为该接口创建一个List,然后你甚至可以存储不属于该类层次结构的对象。

当您需要存储不同类型的对象时,只需实现该类型的接口,这样您就不必对存储列表代码进行任何更改。

答案 3 :(得分:0)

因为从Fruit继承的所有对象足以创建List的{​​{1}}

Fruit

如果我有一个类 List<Fruit>_apples = new List<Fruit>{...} 必须创建一个not extend Fruit作为所有类型(值类型和引用预定义和用户定义)都是直接或间接从{{继承的1}}

List of objects

请注意,如果您不延伸,Fruit无法访问其属性,例如ObjectList<Object>_apples = new List<Object>{...}

答案 4 :(得分:0)

使用此代码在列表中添加不同的对象

List<Fruit> fruits = new List<Fruit>();
            fruits.Add(new Apple("Red"));
            fruits.Add(new Orange("Withseed"));

答案 5 :(得分:0)

我相信您尝试做的是使用不同类型Fruit的列表来存储它们或将它们传递到一个List,而不是需要单独List<Apple> List<Orange> 1}},Apple.Color等。但您仍需要使用特定类型的内容(例如Orange.TypeFruitBasket)。

为了证明这一点,我创建了一个Fruit类,用于存储所有不同的Project()个对象,并public class FruitBasket { public List<Fruit> FruitList { get; } public FruitBasket(List<Fruit> fruitList) { FruitList = fruitList; } public List<string> Project() { var result = new List<string>(); foreach (var fruit in FruitList) { if (fruit is Apple) { var apple = (Apple) fruit; result.Add("This is a " + apple.Color + " " + apple.Name); } else if (fruit is Orange) { var orange = (Orange) fruit; result.Add("A " + orange.Name + " with type: " + orange.Type); } else { result.Add("An unknown " + fruit.Name); } } return result; } } 个对象及其独特的属性。

Fruit

在循环遍历所有不同的var result = new FruitBasket(new List<Fruit> { new Apple { Name = "Fiji Apple", Quality = 9, Color = "Green" }, new Orange { Name = "Indi Orange", Quality = 7, } }).Project(); 对象时,它会检查水果的类型并将唯一的字符串放在列表中。

这个例子的用法是:

result

ICE30: The target file 'eiycriw9.exe|MyApp.exe' is installed in '[ProgramFilesFolder]\Folder\MyAppFolder' by two different components on an LFN system: MyApp.exe and cmp497A0C7040B1E426AA3569D995A62AF2. This breaks component reference counting. 将是:

  

这是绿色斐济苹果

     

Indi Orange类型:WithSeed