C# 使gridview数据源留在接口中,而不是向下转换到对象

C# 使gridview数据源留在接口中,而不是向下转换到对象,c#,asp.net,gridview,datasource,C#,Asp.net,Gridview,Datasource,我有一个C#web应用程序,其中我有一个gridview,它获取一个列表,该列表包含一个接口。有三种对象类型实现列表中的接口 我将gridviews数据源设置为list并调用databind。当我运行应用程序时,出现以下错误: {"Property accessor 'Name' on object 'Bailey.Objects.Company' threw the following exception:'Object does not match target type.'"} 我在列表

我有一个C#web应用程序,其中我有一个gridview,它获取一个列表,该列表包含一个接口。有三种对象类型实现列表中的接口

我将gridviews数据源设置为list并调用databind。当我运行应用程序时,出现以下错误:

{"Property accessor 'Name' on object 'Bailey.Objects.Company' threw the following exception:'Object does not match target type.'"}
我在列表中改变了对象的顺序,发现第一个对象类型工作得很好,但是当它找到另一个对象的第一个实例时,就会抛出这个错误

List<IBaileyObject> listToDisplay = listofItems;
GridViewItemList.DataSource = listToDisplay;
GridViewItemList.DataBind();
List listToDisplay=listofItems;
GridViewItemList.DataSource=listToDisplay;
GridViewItemList.DataBind();
我想要的是数据源和绑定保持在接口上,而不是像看起来那样向下转换到对象

这是因为列表以对象本身而不是接口的形式返回对象,还是gridview中的某个对象正在将其向下转换

还是我走错了路

我希望有人有办法解决这个问题

谢谢

乔恩·霍金斯

编辑


该接口公开名称、ID和TypeName

“HeaderText=“ID”Visible=“False”/


gives无法应用索引器。

能否发布一些GridView代码(特别是在引用IBaileyObject属性的地方)

不知道您使用的语法会使事情变得困难,但您是否尝试过这样做:

<%# (((IBaileyObject)Container.DataItem)["PropertyX"]) %>

希望这有帮助

发布代码后编辑

我认为这是因为您使用的是“BoundField”,它们不够聪明,无法确定您引用的成员来自何处。我的建议是将您的BoundField转换为数据绑定语法:

或者:
或者,


否则,请按照中的建议创建自定义绑定字段控件。

我非常喜欢此解决方案:


它使用一个自定义的BoundField类,该类使用Eval返回值。比在ASPX页面中使用Eval稍微好一些…

我希望我能对此进行100万次投票。超级简单,适用于各种场景。请添加解释在上述解决方案中,我使用了原始海报中的列表listToDisplay=ListoItems。
GridViewItemList.DataSource = listToDisplay.Select(x => new 
                              {
                                  Id = x.Id,
                                  Name = x.Name                        
                              })
                              .ToList();
GridViewItemList.DataBind();
GridViewItemList.DataSource = listToDisplay.Select(x => new 
                              {
                                  Id = x.Id,
                                  Name = x.Name                        
                              })
                              .ToList();
GridViewItemList.DataBind();