我正在将IList绑定到GridView。 IMyInterface看起来像
public interface IMyInterface: IHasTotalHours, IHasLines
{
DateTime GoalStartDate { get; set; }
DateTime GoalEndDate { get; set; }
}
我将一个实例绑定到Grid,如下所示:
IList<IMyInterface> instance= GetMyData();
myGrid.DataSource = instance;
myGrid.DataBind();
将此绑定到网格时,显示在网格中的唯一成员是IMyInterface的直接成员:GoalStartDate和GoalEndDate。
为什么?如何让网格显示它继承的其他接口的成员?
更新 继承的接口定义了简单的数据属性,如
public interface IHasTotalHours
{
string Description { get; set; }
int Hours{ get; set; }
}
public interface IHasLines
{
double TotalLines { get; set; }
double LinesPerHour { get; set; }
}
有一个实现IMyInterface的类:
public class MyClass : IMyInterface
{
public string Description { get; set; }
public int Hours { get; set; }
public double TotalLines { get; set; }
public double LinesPerHour { get; set; }
public DateTime GoalStartDate { get; set; }
public DateTime GoalEndDate { get; set; }
}
这些被转换为IMyInterface,并在我绑定到GridView的列表中返回。
答案 0 :(得分:7)
数据绑定控件不使用反射,而是使用TypeDescriptor从数据源获取属性。在TypeDescriptor.GetProperties方法中,您可以阅读以下内容:
组件的属性可以 不同于一个类的属性, 因为该网站可以添加或删除 如果组件位于该属性,则为属性。
显然,默认实现只返回Interface的直接属性而不是继承的属性。
幸运的是,这种机制是可扩展的,您可以使用自定义属性信息实现编写TypeConverter类。请参阅TypeConverter文档中的备注以实现属性逻辑。
您的自定义TypeConverter类的GetProperties实现可以在您的接口上调用TypeDescriptor.GetProperties(Type)以及它所有的继承接口。但也许你甚至可以编写一个通用的TypeConverter,通过使用反射找到所有继承的属性。
然后使用TypeConverterAttribute属性将此自定义TypeConverter附加到您的接口。
然后,就像魔术一样,数据源会找到所有属性。 ; - )
答案 1 :(得分:-1)
这是因为接口是契约,而这是与对象交互的唯一方法是通过该特定契约。其他接口不能被假设,并且在制作演员表之前无法使用。
因此,当您将List of T绑定到某个东西时,数据网格不知道那些其他接口。并且datagrid不会使用反射来确定可能继承的其他类或接口。数据网格可用的唯一对象属性是T接口公开的属性。
如果希望datagrid可以访问所有属性,则需要绑定List。