结合的IList 不显示IMyInterface的接口继承的成员
-
22-08-2019 - |
题
我结合的IList到GridView。 IMyInterface的样子
public interface IMyInterface: IHasTotalHours, IHasLines
{
DateTime GoalStartDate { get; set; }
DateTime GoalEndDate { get; set; }
}
我一个实例绑定到这样的网格:
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列表中返回。
解决方案
数据绑定控件不使用反射而是TypeDescriptor从数据源获取的属性。在 TypeDescriptor.GetProperties 方法,可以阅读以下内容:
要组分的性质可以 从一个类的属性不同, 因为该网站可以添加或删除 属性如果组件选址。
显然,缺省实现将只从一个接口返回的直接属性,而不是继承的。
幸运的是这机制是可扩展的,并且可以编写一个的TypeConverter 类自定义属性信息的实现。请参考的TypeConverter文档在备注栏用于实现属性的逻辑。
在实施的GetProperties自定义类型转换器类的可以在界面上调用TypeDescriptor.GetProperties(类型)和所有它继承的接口。但是,也许你甚至可以编写一个通用的类型转换器,将通过使用反射找到所有继承属性。
然后您将这个自定义类型转换器与TypeConverterAttribute属性的界面。
然后,如魔术,数据源会发现的所有属性。 ; - )
其他提示
这是因为一个接口是一个合同,这是与对象进行交互的唯一方式是通过该特定的合同。其它接口不能假定,并且不能被利用,直到铸造而成。
所以,当你T的列表绑定到的东西,在DataGrid不知道这些其他接口。同时DataGrid将不会使用反射来找出其他类或接口可能被继承。该将要提供给数据网格的唯一对象属性是由T接口公开的属性。
您需要,如果你想在DataGrid能够访问所有属性绑定列表。