C#如何将对象列表传递给构造函数?

C#如何将对象列表传递给构造函数?,c#,list,types,constructor,C#,List,Types,Constructor,我想将对象列表传递给NavigationPage的构造函数,以便填充该页面上ListView的内容 这些对象将是不同的类型,它们都是从同一父对象继承的,该父对象是一个称为“Animal”的抽象类,定义如下: abstract class Animal { ... public List<Animal> Animals = new List<Animal>(); public AnimalListPage(string title, List<Animal

我想将对象列表传递给NavigationPage的构造函数,以便填充该页面上ListView的内容

这些对象将是不同的类型,它们都是从同一父对象继承的,该父对象是一个称为“Animal”的抽象类,定义如下:

abstract class Animal { ...
public List<Animal> Animals = new List<Animal>();

    public AnimalListPage(string title, List<Animal> animals) {
    ....
var horses = new List<Horse>() {
    new Horse("Silver", 65, 70),
    new Horse("Tucker", 60, 68)
};
horsesListPage = new AnimalListPage("Horses", horses);
....
继承的类如下所示:

public class Horse : Animal { ...

public class Cow : Animal { ...

public class Dog : Animal { ...
显示此列表的页面是从NavigationPage继承的类,如下所示:

abstract class Animal { ...
public List<Animal> Animals = new List<Animal>();

    public AnimalListPage(string title, List<Animal> animals) {
    ....
var horses = new List<Horse>() {
    new Horse("Silver", 65, 70),
    new Horse("Tucker", 60, 68)
};
horsesListPage = new AnimalListPage("Horses", horses);
....
public List Animals=new List();
公共动物图片(字符串标题,动物列表){
....
我创建了AnimalListPage对象,如下所示:

abstract class Animal { ...
public List<Animal> Animals = new List<Animal>();

    public AnimalListPage(string title, List<Animal> animals) {
    ....
var horses = new List<Horse>() {
    new Horse("Silver", 65, 70),
    new Horse("Tucker", 60, 68)
};
horsesListPage = new AnimalListPage("Horses", horses);
....
var=newlist(){
新马(“银色”,65,70),
新马(“塔克”,60,68)
};
horsesListPage=新动物保护区(“马”,马);
....
编辑:回应一些建议;澄清:我需要在列表中保留“马”、“牛”、“狗”等对象类型,因为每个动物类型都有要显示的唯一属性。此外,动物列表的每个实例都只有一种类型,即永远不会有一个组合马、牛和狗的列表

但我得到了一个错误:

错误CS1503参数2:无法从System.Collections.Generic.List转换为System.Collections.Generic.List

我必须以某种方式将“Horse”列表“强制”为类型“Animal”吗?还是使“AnimalListPage()”构造函数不太特定于类型?我该怎么做


注意:我正在使用Xamarin进行开发(尽管我认为这与此问题无关)。

只需按照构造函数的预期将您的列表设置为
列表即可:

var horses = new List<Animal>() {
    new Horse("Silver", 65, 70),
    new Horse("Tucker", 60, 68)
};
var=newlist(){
新马(“银色”,65,70),
新马(“塔克”,60,68)
};
如果您不控制值的来源,并且它可以是任何派生类型的
列表
,则需要执行强制转换操作以将其用作
列表

var horses=someExistingList.Cast().ToList();

只需按照构造器的预期将您的列表设置为一个
列表即可:

var horses = new List<Animal>() {
    new Horse("Silver", 65, 70),
    new Horse("Tucker", 60, 68)
};
var=newlist(){
新马(“银色”,65,70),
新马(“塔克”,60,68)
};
如果您不控制值的来源,并且它可以是任何派生类型的
列表
,则需要执行强制转换操作以将其用作
列表

var horses=someExistingList.Cast().ToList();
以下是一些选项:

简单的解决方案是使用
列表
而不是
列表
。这样,您的代码将符合构造函数请求的类型

更复杂的是将
AnimalListPage
设置为泛型。然后,您可以在
AnimalListPage
中强烈键入要使用的
AnimalListPage
类型。仅当您有一种
Animal
要使用时,此操作才有效

最后一个选项是使用共变量接口,
IAnimal
,并将其用作列表类型。所有
Animal
类型都应该实现这一点,但我想您已经可以在基类中实现了。或者使用共变量集合接口,如
IEnumerable
以下是一些选项:

简单的解决方案是使用
列表
而不是
列表
。这样,您的代码将符合构造函数请求的类型

更复杂的是将
AnimalListPage
设置为泛型。然后,您可以在
AnimalListPage
中强烈键入要使用的
AnimalListPage
类型。仅当您有一种
Animal
要使用时,此操作才有效


最后一个选项是使用共变量接口,
IAnimal
,并将其用作列表类型。所有的
Animal
类型都应该实现这一点,但我想您已经可以在基类中实现了。或者使用共变量集合接口,如
IEnumerable
让我解释一下这种情况的本质很少。
无法将集合隐式转换为基类型的集合,即使它听起来安全且正确。
设想以下情况:

public void CalledMethod(List<Animal> animals)
{ 
    animals.Add(new Dog()); 
    // error! you've tried to insert a dog into List<Horse>
}

public void CallingMethod()
{
    var horses = new List<Horse>() {
      new Horse("Silver", 65, 70),
      new Horse("Tucker", 60, 68)
    };

    CalledMethod(horses);

    string result = horses[2].RideOrDoSomeOtherHorseOnlyThings(); // it would be strange
}
public void CalledMethod(列出动物)
{ 
添加(新狗());
//错误!您试图在列表中插入一只狗
}
公共无效调用方法()
{
var=newlist(){
新马(“银色”,65,70),
新马(“塔克”,60,68)
};
称为方法(马);
string result=horses[2]。RideOrDoSomeOtherHorseOnlyThings();//这会很奇怪
}

你需要通过声明
List
而不是
List
,或者使用
.Cast()
扩展方法来传递
动物的集合,正如其他回答者已经充分描述的那样。

让我解释一下这种情况的性质。
无法将集合隐式转换为基类型的集合,即使它听起来安全且正确。
设想以下情况:

public void CalledMethod(List<Animal> animals)
{ 
    animals.Add(new Dog()); 
    // error! you've tried to insert a dog into List<Horse>
}

public void CallingMethod()
{
    var horses = new List<Horse>() {
      new Horse("Silver", 65, 70),
      new Horse("Tucker", 60, 68)
    };

    CalledMethod(horses);

    string result = horses[2].RideOrDoSomeOtherHorseOnlyThings(); // it would be strange
}
public void CalledMethod(列出动物)
{ 
添加(新狗());
//错误!您试图在列表中插入一只狗
}
公共无效调用方法()
{
var=newlist(){
新马(“银色”,65,70),
新马(“塔克”,60,68)
};
称为方法(马);
string result=horses[2]。RideOrDoSomeOtherHorseOnlyThings();//这会很奇怪
}

您需要通过声明
List
而不是
List
,或者使用
.Cast()
扩展方法传递
Animal
集合,正如其他回答者已经完全描述的那样。

var horses=new List(){…只需使用
var horses=new List()
var horses=new List(){…只需使用
var horses=new List()
就错过了一个选项(有点像,您的上一个选项谈到了它)。如果可能,请更改构造函数以接受
IReadOnlyList
IReadOnlyCollection
IEnumerable
(所有协变接口).无需制作一个
IAnimal
I编辑为问题,以澄清我