Если вы используете .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>
например.