LinQ contiene el método moldeada que arroja cada entrada en la lista para escribir T. Digamos que tenemos una lista que tiene el siguiente aspecto:LINQ moldeada <T> con System.Type
List<Object> obj = new List<Object>();
obj.Add("A");
obj.Add("B");
Un modelo de trabajo podría ser
var list = obj.Cast<string>();
Lo que me gustaría trabajar
Type t = typeof(String);
Object list = obj.Cast(t);
Una solución sería utilizar reflexionar y genéricamente crear una lista y poblarla, pero me preguntaba si existe alguna solución mejor. Se enteró de que .NET 4.0 debería ser compatible con algunas co/contravariancias que pueden ser una forma de hacerlo.
extra Soulution información y reflexión
El error que consigo es la siguiente 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]
. Tenga en cuenta que CrashEntry implementa IStaticEntry pero no se puede convertir porque es un tipo genérico de la lista.
que construye la siguiente solución a través de Stille lo haría como algo sin reflexión:
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;
}
http://geekswithblogs.net/abhijeetp/archive/2010/01/10/covariance-and-contravariance-in-c-4.0.aspx –