В C#, я хочу взять массив типа «Т» где я знаю, что «T» поддерживает интерфейс «IMyInterface» и:В C#, как я могу преобразовать свой массив из IEnumerable <IMyInterface> в IEnumerable <T>?
- Cast как массив «IMyInterface»
- вызовов метод в этом массиве, который будет фильтровать список
- Верните его в исходный список типов T.
1 и 2 выше работают нормально, но я столкнулся с проблемами на шаге 3.
Вот мой код:
IEnumerable<IMyInterface> castedArray = originalTypedArray as IEnumerable<IMyInterface>;
if (castedArray != null)
{
var filteredArray = castedArray.Where(r => r.Ids.Contains(MyId)).ToList();
IEnumerable<T> castedBackToOriginalTypeArray = filteredArray as IEnumerable<T>;
if (castedBackToOriginalTypeArray == null)
{
current = new List<T>();
}
else
{
current = castedBackArray;
}
// I need to cast back, because only my Type T has the .Id property
List<int> ids = current.Select(r => r.Id).ToList();
}
Вопрос находится на этой линии:
IEnumerable<T> castedBackToOriginalTypeArray = filteredArray as IEnumerable<T>;
Это всегда, кажется, вернуть нуль (вместо отфильтрованного массива отбрасывать обратно IEnumerable < T>.
Любые предложения здесь о том, что я могу сделать неправильно и как исправить листинг массива интерфейса обратно в массив типа T?
Работает ли от 'T' до' IMyInterface' без IEnumerable? – kat1330
Зачем вам вообще бросать? Не можете ли вы отфильтровать исходный 'IEnumerable'? –
@LucMorin - Я делаю фильтр на IEnumerable, но мне нужно его вернуть обратно к исходному типу, потому что от него зависит моя следующая строка кода. Я обновил вопрос, чтобы сделать это более ясным –
leora