Sie easly Art der Liste erstellen, können Sie über Activator
wollen, dann werfen zu IList
und verwenden es:
private IList readObjects(System.Type objType)
{
var listType = typeof(List<>).MakeGenericType(curType);
var list = (IList)Activator.CreateInstance(listType);
// ...
while (_rs.Read())
{
// ...
list.Add(_objItem);
}
}
list
Instanz von List<YorActualType>
sein wird.
aktualisiert
Wenn Sie Ihre Methode mit generischen Argumenten zu erklären, nehmen Sie Typinformationen während der Kompilierung zur Verfügung stellen. Andernfalls müssen Sie Reflexion verwenden.
Da Sie Typinformationen in Laufzeit bereitstellen (curType
kann jede Art von Informationen enthalten), Compiler weiß nicht, was genau Typ verwendet wird, und Sie können Ihre Methode nicht erklären, etwas Konkretes zurückzugeben. Nur Abstraktionen erlaubt.
Lassen Sie uns mich zeigen auf etwas verrückt, aber anschauliches Beispiel:
var types = new [] { typeof(int), typeof(string) };
var rand = new Random();
var list = readObjects(types[rand.Next(0,2)];
Bis zum letzten Augenblick noch werden Sie nicht wissen, was genau Art der Liste erstellt wird. Compiler weiß es auch nicht. Compiler wird nie wissen, was genau Typ sollte verwendet werden, wenn Sie ihm nicht Ihre Typen bereitstellen. Wenn Sie Type
verwenden, teilt es dem Compiler nur mit, dass einige reguläre Parameter mit dem Typ Type
zur Laufzeit an die Methode übergeben werden. Es gibt keine Daten, die während der Kompilierzeit auf einen Typ schließen lassen. Diese Daten können nur über generic type parameters weitergegeben werden.
So gibt es mehrere Möglichkeiten, die Sie folgen können:
genaue Arten Geben Sie bei der Kompilierung benötigen
private List<T> readObjects<T>()
{
var objType = typeof(T);
var list = new List<T>();
// rest of code....
}
Verwenden Reflexion und Basistypen
private IList readObjects(Type objType)
{
// rest of code with Activator and so on
}
Und Die spätere Verwendung hängt von Ihren Bedürfnissen ab. Wenn Sie wissen, welche Art Sie verwenden werden, konvertieren einfach:
var list = (IList<MyType>)readObjects(typeof(myType));
Aber ich denke, in diesem Fall eines bessere Nutzung Art und Weise # 1 mit generischem Argumente.
Andernfalls werden Sie Reflexion verwenden.Oder einige Basisklassen, Schnittstellen und so weiter. Es hängt davon ab, welche Aufgabe Sie lösen werden.
P.S. Sie können mehr über generic types auf MSDN lesen.
Nein, Sie können nicht erwarten, dass Ihr Compiler einen Typ ableitet, den Sie nur zur Laufzeit bereitstellen. Das, was auch immer du tust, benutze Reflektion oder was auch immer * wird immer nur 'Objekt' zurückgeben. Sie müssen beim Kompilieren wissen, welcher genaue Typ es tatsächlich ist. – HimBromBeere
haben Sie versucht, Ihre Methode in readObjects() zu ändern? und zwicke deine Methode, um den Typ zu erhalten, der auf T basiert ... –
Rex
Wie nennst du 'ReadObjects'? Und was machst du danach mit 'currentList'? – HimBromBeere