LinQ contiene il metodo Fusioni che getta ogni voce nell'elenco di digitare T. Consente di dire che abbiamo una lista che si presenta come il seguente:Linq Fusioni <T> con System.Type
List<Object> obj = new List<Object>();
obj.Add("A");
obj.Add("B");
Un cast di lavoro potrebbe essere
var list = obj.Cast<string>();
Quello che mi piacerebbe lavorare
Type t = typeof(String);
Object list = obj.Cast(t);
Una soluzione potrebbe essere quella di utilizzare riflessione e genericamente creare un elenco e popolarlo, ma mi chiedevo se esiste una soluzione migliore? Ho sentito che .NET 4.0 dovrebbe supportare qualche co/contro-varianza che potrebbe essere un modo per farlo.
informazione e di riflessione supplementare Soulution
L'errore che ottengo è la seguente 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]
. Nota che CrashEntry implementa IStaticEntry ma non può essere castato perché è un tipo generico della lista.
ho costruito la seguente soluzione attraverso lo farei stille come qualcosa senza riflettere:
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 –