2010-01-12 9 views
2

Я все еще изучаю некоторые из этих материалов C#, и я не мог найти ответа на этот вопрос. Если предположить, что у меня есть список MyObject реализующего MyInterfaceСписок кастингов <MyObject> to IEnumerable <MyInterface>

public class MyObject : IMyInterface { ...} 

public List<MyObject> MyObjectList; 

Как я могу возвращать IEnumerable<IMyInterface> с содержимым MyObjectList?

Я имею в виду, прямо сейчас у меня есть это:

Но это необходимо, чтобы создать новый список, как это?

спасибо.

+0

Почему бы не создать исходный список как: public List MyObjectList; Затем вы можете заполнить его любым объектом, который реализует этот интерфейс. Для меня это был бы нормальный подход и почему я определял бы интерфейс таким образом. Какова цель вашего кода, который может помочь и даже может показать, что интерфейс не является ответом, который вы ищете. – Lazarus

+1

FYI, это преобразование будет законным в C# 4. См. Мой архив заметок о дизайне этой функции C# 4, если эта тема вас интересует: http://blogs.msdn.com/ericlippert/archive/tags/Covariance+and + контрвариация/по умолчанию.aspx –

+0

Если я создаю Список , есть некоторые свойства привязки, которые не будут отобраны XAML, когда ItemsSource в список – Habitante

ответ

6

Если вы используете .NET 3.5, самый простой способ сделать это:

return MyObjects.Cast<IMyInterface>(); 

Вам не нужно, чтобы создать копию всего - но до C# 4 не выходит с общим интерфейсом дисперсия, вы застряли делать что-то вот так.

Если вы все еще используете .NET 2.0, вы можете легко сделать что-то подобное:

public static IEnumerable<TResult> SafeCast<TSource, TResult> 
    (IEnumerable<TSource> source) where TResult : TSource 
{ 
    foreach (TSource item in source) 
    { 
     yield return item; 
    } 
} 

(Обратите внимание, что это не проверяет source будучи нуль, чтобы сделать это правильно, вы хотите два . методы в связи с отсрочкой исполнения блоков итераторов)

Затем используйте:

return SafeCast<MyObject, IMyInterface>(MyObjects); 

Вы могли сделать это М.О. походите версии LINQ, как это:

public static IEnumerable<T> SafeCast<T>(IEnumerable source) 
{ 
    foreach (T item in source) 
    { 
     yield return item; 
    } 
} 

return SafeCast<IMyInterface>(MyObjects); 

Это время компиляции безопасности, хотя - это не остановит вас от попыток превратить List<string> в IEnumerable<Guid>, например.

+0

Большое спасибо, что я сделал это понятным для меня понятием! – Habitante

0

Используя метод LINQ Cast хорошо работает здесь, что-то вроде MyObjects.Cast()

0

Если вы используете C# 3 и .NET 3.5 (или выше), то вы можете использовать предложение LINQ, что Джейк представил:

return MyObjectList.Cast<IMyInterface>(); 

(Там нет необходимости AsEnumerable в данном обстоятельстве)

Однако, если вы используете предыдущую версию (2.0 C# и .NET или выше), вы можете использовать блок итератора :

foreach(MyObject obj in MyObjectList) yield return (IMyInterface)obj; 
Смежные вопросы