Приведение типов BindingList из источника данных DataGridView - PullRequest
0 голосов
/ 30 декабря 2011

У меня есть интерфейс IDoc и абстрактный класс, который реализует его с именем Doc. Затем у меня есть класс с именем BookDoc, который наследуется от Doc, и другой класс JournalDoc, который также наследуется от Doc.

Теперь я хотел бы связать BindingList<BookDoc> или BindingList<JournalDoc> с пользовательским DataGridView. Затем я хочу получить доступ к свойству Errors, которое они оба наследуют от класса Doc.

полуработающий пример:

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 Ответ

2 голосов
/ 30 декабря 2011

Если вы используете .NET 4.0, вы можете воспользоваться ковариацией , используя IEnumarable<>:

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);
}
...