2010-06-22 4 views
3

У меня есть класс с этими свойствами:Как вы извлекаете производные типы из общего списка?

public List<CommitmentItem<ITransaction, ITransactionItem>> CommitmentItems; 
public List<CapitalCallCommitmentItem> CapitalCallCommitmentItems; 

CapitalCallCommitmentItem наследуется CommitmentItem. Я хочу, чтобы свойство CapitalCallCommitmentItems возвращало все CommitmentItems, где тип CapitalCommCommitmentItem. Так что я попробовал этот код:

get 
{     
    return CommitmentItems 
     .Where(c => c.GetType() == typeof(CapitalCallCommitmentItem)) 
     .Select(c => (CapitalCallCommitmentItem)c) 
     .ToList(); 
} 

Однако я получаю сообщение об ошибке сказав:

Ошибка 1 не удается преобразовать тип «Models.CommitmentItem» до «Models.CapitalCallCommitmentItem»

Что правильный путь сделай это?

+2

Имя вопроса не имеет значения :( – Restuta

+1

@Restutat - это общее имя вопроса: P –

ответ

12

Используйте метод расширения OfType.

return CommitmentItems.OfType<CapitalCallCommitmentItem>().ToList(); 

В вашем коде, хотя вы фильтрации на подтипа в пункте where, он по-прежнему будет возвращать общий тип списка. OfType вернет перечислимый тип.

2

уверен, что это кабриолет/литой/тип.

попробуйте например
.Cast<T>()
.OfType<T>()

+0

Для OfType он даже не должен быть закрыт. – Dykam

+0

Я знаю, но вроде ... он должен скорее указать " типа ":) –

1

Вы на него. На моей машине отлично работает. Полученный список будет иметь тип List<CapitalCallCommitmentItem>:

get 
{     
    return CommitmentItems 
     .Where(c => c is CapitalCallCommitmentItem) 
     .Select(c => c as CapitalCallCommitmentItem) 
     .ToList(); 
} 

Update: ... но да, CommitmentItems.OfType<CapitalCallCommitmentItem> лучше.

Смежные вопросы