";对象与目标类型“”不匹配;在C#web应用程序中将GridView控件与具有不同类型的List绑定时出错

本文关键字:控件 GridView 同类型 List 出错 定时 绑定 应用程序 类型 目标 对象 | 更新日期: 2023-09-27 18:26:22

对于C# web应用程序,我正在用不同类型的对象填充List(使用Factory模式),即List<IAnimal>存储类型为Cat或Dog的对象。将此列表绑定到GridView控件时,会发生"对象与目标类型不匹配"异常。而同一List与ListView控件成功绑定。关于如何解决这个问题有什么建议吗?

这里提到的代码片段供您参考:

protected void Page_Load(object sender, EventArgs e)
{
    grdAnimals.DataSource = CreateAnimalList();
    grdAnimals.DataBind();
}
private List<IAnimal> CreateAnimalList()
{
    List<IAnimal> objAnimals = new List<IAnimal>();
    for (int i = 1; i <= 10; i++)
    {
        if (i % 2 == 0)
        {
            IAnimal objCat = new Cat();
            objCat.Name = "Cat" + i;
            objCat.Breed = "Cat";
            objAnimals.Add(objCat);
        }
        else
        {
            IAnimal objDog = new Dog();
            objDog.Name = "Dog" + i;
            objDog.Breed = "Dog";
            objAnimals.Add(objDog);
        }
    }
    return objAnimals;
}

IAnimal接口有两个属性,相同的属性在DogCat类中实现:

public interface IAnimal
{
    string Name { get; set; }
    string Breed { get; set; }
}

";对象与目标类型“”不匹配;在C#web应用程序中将GridView控件与具有不同类型的List绑定时出错

当绑定到集合时,如果集合中的项不是同一类型,就会出现此问题。这个问题源于这样一个事实,即它不是查看集合的类型参数(在您的情况下为IAnimal),而是使用数据源的第一个元素来确定集合中所有项的类型,因此,如果您的数据源具有不同类型的项,即使它们都派生自一个公共基或具有相同的属性集,你仍然会得到这个异常(除非你很幸运,并且与第一个项目不属于同一类型的项目都是从它派生的类型)。

一个可能的解决方案是创建一个包装器(比如AnimalWrapper),包装单个DogCat实例,并公开需要在网格中显示的属性,然后绑定到List<AnimalWrapper>