";对象与目标类型“”不匹配;在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
接口有两个属性,相同的属性在Dog
和Cat
类中实现:
public interface IAnimal
{
string Name { get; set; }
string Breed { get; set; }
}
当绑定到集合时,如果集合中的项不是同一类型,就会出现此问题。这个问题源于这样一个事实,即它不是查看集合的类型参数(在您的情况下为IAnimal
),而是使用数据源的第一个元素来确定集合中所有项的类型,因此,如果您的数据源具有不同类型的项,即使它们都派生自一个公共基或具有相同的属性集,你仍然会得到这个异常(除非你很幸运,并且与第一个项目不属于同一类型的项目都是从它派生的类型)。
一个可能的解决方案是创建一个包装器(比如AnimalWrapper
),包装单个Dog
和Cat
实例,并公开需要在网格中显示的属性,然后绑定到List<AnimalWrapper>
。