LinQ enthält die Methode Guss die jeden Eintrag in der Liste wirft T einzugeben. Lassen Sie uns sagen wir eine Liste haben, die wie folgt aussieht:Linq Guss <T> mit System.Type
List<Object> obj = new List<Object>();
obj.Add("A");
obj.Add("B");
Ein Arbeitsmodell
var list = obj.Cast<string>();
sein könnte Was würde Ich mag
Type t = typeof(String);
Object list = obj.Cast(t);
Eine Lösung wäre die Verwendung arbeiten Reflexion und generische erstellen Sie eine Liste und füllen Sie es, aber ich frage mich, ob es eine bessere Lösung gibt? Gehört, dass .NET 4.0 einige Co/Kontravarianz unterstützen sollte, was ein Weg dazu sein könnte.
Zusätzliche Informationen und Reflexion Soulution
Der Fehler ich erhalte, ist die folgende 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]
. Beachten Sie, dass CrashEntry IStaticEntry implementiert, aber nicht gegossen werden kann, da es sich um einen generischen Typ der Liste handelt.
Ich konstruierte folgende Lösung durch würde ich stille wie etwas ohne Reflexion:
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 –