Если вы используете .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>
, например.
Почему бы не создать исходный список как: public List MyObjectList; Затем вы можете заполнить его любым объектом, который реализует этот интерфейс. Для меня это был бы нормальный подход и почему я определял бы интерфейс таким образом. Какова цель вашего кода, который может помочь и даже может показать, что интерфейс не является ответом, который вы ищете. –
Lazarus
FYI, это преобразование будет законным в C# 4. См. Мой архив заметок о дизайне этой функции C# 4, если эта тема вас интересует: http://blogs.msdn.com/ericlippert/archive/tags/Covariance+and + контрвариация/по умолчанию.aspx –
Если я создаю Список, есть некоторые свойства привязки, которые не будут отобраны XAML, когда ItemsSource в список –
Habitante