Wie wird ListT instanziiert, aber T ist bis zur Laufzeit unbekannt?

7

Angenommen, ich habe eine Klasse, die bis zur Laufzeit unbekannt ist. Zur Laufzeit bekomme ich eine Referenz, Typ x, die auf Foo.GetType () verweist. Kann ich nur mit x und List & lt; & gt; eine Liste vom Typ Foo erstellen?

Wie geht das?

    
xport 08.10.2010, 07:07
quelle

4 Antworten

19
%Vor%

Natürlich sollten Sie hier keine Typsicherheit erwarten, da die resultierende Liste zum Zeitpunkt der Kompilierung vom Typ object ist. Die Verwendung von List<object> wäre praktischer, aber immer noch eine eingeschränkte Typsicherheit, da der Typ von Foo nur zur Laufzeit bekannt ist.

    
Darin Dimitrov 08.10.2010, 07:15
quelle
11

Sicher kannst du:

%Vor%

Das Problem hier ist, dass fooList vom Typ object ist, also müssten Sie es immer noch in einen "verwendbaren" Typ umwandeln. Aber wie würde dieser Typ aussehen? Als Datenstruktur, die das Hinzufügen und Nachschlagen von Objekten vom Typ T List<T> (oder besser IList<> ) unterstützt, ist keine Kovariante in T vorhanden, sodass Sie List<Foo> nicht auf List<IFoo> und Foo: IFoo umwandeln können. Sie könnten es in ein IEnumerable<T> umwandeln, das in T kovariant ist.

Wenn Sie C # 4.0 verwenden, können Sie auch fooList auf dynamic anwenden, damit Sie es zumindest als Liste verwenden können (z. B. Objekte hinzufügen, suchen und entfernen).

Angesichts all dieser Tatsache und der Tatsache, dass Sie beim Erstellen von Typen zur Laufzeit sowieso keine Art der Kompilierungssicherheit haben, ist die Verwendung von List<object> wahrscheinlich die beste / pragmatischste Methode in diesem Fall.

    
Frank 08.10.2010 07:18
quelle
0

In etwa so:

Activator.CreateInstance (typeof (Liste & lt; & gt;). MakeGenericType (Typ))

    
Artem Tikhomirov 08.10.2010 07:17
quelle
-1

Wenn Sie einen Typ angeben, können Sie eine neue Instanz auf diese Weise instanziieren:

%Vor%

Hinweis: Ссылка

    
Will 08.10.2010 07:12
quelle

Tags und Links