2011-12-30 1 views
0

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

Теперь то, что я хотел бы сделать, это связать либо 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); 
} 

Приведенный выше пример работает, и я получаю список Docs, заполняемый и я могу получить доступ к собственности ошибки, но все равно придется жестко закодировать тип списка, который был первоначально связанный ,

Что бы я хотел сделать, это что-то вроде этого, хотя я не уверен, что это возможно.

var dataSource = this.DataSource as BindingSource; 

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

Это дает мне список нулевых документов.

ответ

2

Если вы используете .NET 4.0, вы можете воспользоваться covariance помощью 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); 
} 
+0

Большое спасибо, что мне нужно –