Самый простой способ - использовать блок итератора:
public IEnumerable<TTarget> FilteredCast<TSource,TTarget>
(IEnumerable<TSource> source)
where TSource : class
where TTarget : class, TSource
{
foreach (TSource element in source)
{
TTarget converted = element as TTarget;
if (converted != null)
{
yield return converted;
}
}
}
(Между прочим, это метод Enumerable.OfType
в LINQ to Objects. Кстати, я ограничил его ссылочными типами для удобства, но он все еще универсален, поэтому вы можете использовать его более легко.)
Тогда просто напишите:
List<DynamicObj> GetFilteredObjs(List<BaseObj> baseList)
{
return new List<DynamicObj>(FilteredCast<BaseObj,DynamicObj>(baseList);
}
Обратите внимание, что это не будет возвращать нули. Если вы хотите, чтобы значения NULL были включены, вам необходимо учитывать это явно.