Считают, что я имею следующий метод: использованиеколлекция Cast объектов в коллекции конкретного класса
public T Resolve<T>()
{
var targetType = typeof(T);
if (targetType.IsGenericType
&& targetType.GetGenerictTypeDefinition() == typeof(IEnumerable<>))
{
List<object> collection = this.ResolveCollection(targetType);
return (T)(object)collection;
}
return (T)this.ResolveSingle(targetType);
}
Пример:
IEnumerable<IFoo> coll = myClass.Resolve<IEnumerable<IFoo>>();
Очевидно, что образец выбросит исключение invalid cast, из-за ковариации - мы не можем отличить List<object>
в IEnumerable<IFoo>
, несмотря на то, что collection
содержит только версии IFoo
. Есть ли какое-либо обходное решение для этой проблемы при использовании рефлексивных и не общих методов? Я не хочу менять подпись Resolve
, поэтому у меня нет общего типа элемента для использования LINQ Cast
.
Как определяется 'ResolveCollection'? Почему он возвращает 'List
'ResolveCollection' не является универсальным, поэтому он не может возвращать коллекцию конкретных классов. Учтите, что 'ResolveCollection' является внешним, поэтому его нельзя изменить или просмотреть источник. Требуется только 'Type', где' Type' является 'IEnumerable' и возвращает' List' с несколькими экземплярами типа общего аргумента 'IEnumerable'. –
Что-то странное в вашем состоянии 'if'. Вы имели в виду 'targetType.IsGenericType && targetType.GetGenericTypeDefinition() == typeof (IEnumerable <>)'? –