从DataGridView数据源键入Casting BindingList

时间:2011-12-30 14:01:52

标签: c# casting datasource bindinglist

我有一个接口IDoc和一个名为Doc的抽象类。然后我有一个名为BookDoc的类继承自Doc,另一个类JournalDoc也继承自Doc。

现在我想做的是将BindingList<BookDoc>BindingList<JournalDoc>绑定到自定义DataGridView。然后,我希望能够访问它们都从Doc类继承的Errors属性。

半工作示例:

var dataSource = this.DataSource as BindingSource;

BindingList<BookDoc> tempBookDocs = dataSource.DataSource as BindingList<BookDoc>;

var Docs = new List<IDoc>();

foreach (var tempDoc in tempBookDocs)
{
    Docs.Add(tempDoc);
}

上面的示例有效,我得到一个已填充的文档列表,我可以访问Errors属性,但仍然必须硬编码最初绑定的列表类型。

我想做的事情是这样的,虽然我不确定是否可能。

var dataSource = this.DataSource as BindingSource;

BindingList<Doc> Docs = dataSource.DataSource as BindingList<Doc>;

这给了我一个空文档列表。

1 个答案:

答案 0 :(得分:2)

如果您使用的是.NET 4.0,则可以使用IEnumarable<>来利用covariance

IEnumarable<Doc> tempBookDocs = dataSource.DataSource as IEnumarable<Doc>;

var Docs = new List<IDoc>();

foreach (var tempDoc in tempBookDocs)
{
    Docs.Add(tempDoc);
}

如果您使用的是.NET 3.5,则可以使用LINQ OfType扩展方法:

IEnumarable<Doc> myDocs = ((IEnumarable)dataSource.DataSource).OfType<Doc>();

var Docs = new List<IDoc>();

foreach (var tempDoc in myDocs)
{
    Docs.Add(tempDoc);
}