LinQ содержит Бросок метода, который бросает каждую запись в списке к типу T. Позволяет говорят, что у нас есть список, который похож на следующее:
List<Object> obj = new List<Object>();
obj.Add("A");
obj.Add("B");
Бросок работы мог быть
var list = obj.Cast<string>();
Что я хотел бы работать
Type t = typeof(String);
Object list = obj.Cast(t);
Решение состояло бы в том, чтобы использовать отражение и универсально создать список и заполнить его, но я задавался вопросом, существуют ли там какое-либо лучшее решение? Услышанный, что.NET 4.0 должна поддерживать некоторый co/contra-variance, который может быть способом сделать это.
Дополнительная информация и отражательный Soulution
Ошибка, которую я получаю, следующая The model item passed into the dictionary is of type System.Collections.Generic.List1[IStatisticEntry], but this dictionary requires a model item of type System.Collections.Generic.List1[CrashStatistic+CrashEntry]
. Обратите внимание, что CrashEntry реализует IStaticEntry, но не может быть литым, потому что это - универсальный тип списка.
Я создал доводящее до конца решение, я буду турникет как что-то без Отражения:
public static object Cast(this IEnumerable list, Type type)
{
var newList = Activator.CreateInstance(typeof(List<>).MakeGenericType(type));
foreach (var item in list)
newList.GetType().GetMethod("Add").Invoke(newList, new object[] { item });
return newList;
}