Backdooring generische Listen über IList

8

Ich habe ein Szenario, in dem eine Klasse Objekte eines Typs lädt. Wegen Abstraktionen kann ich keine generische Klasse verwenden (Generika verbreiten sich wie Krebs :), aber ich möchte oft mit einer generischen Version der einmal abgerufenen Objekte arbeiten , was zu folgendem Code (vereinfacht) führte:

%Vor%

Wo LoadItems ein List & lt; Objekt & gt; zurückgibt, dann wurde mir klar, warum nicht stattdessen

%Vor%

Jetzt kann ich das stattdessen tun

%Vor%

Was sollte effizienter sein. Es scheint auch etwas flexibler zu sein, da ich eine bestehende Liste nehmen und neue Gegenstände anheften kann. Also meine Fragen sind, ist dies ein allgemeines Muster oder hast du einen anderen / besseren Weg dies zu erreichen?

Ich bin auch ein bisschen neugierig, dass Sie das tun können, wenn Sie versuchen, ein Objekt vom falschen Typ hinzuzufügen, erhalten Sie eine Ausnahme, aber bedeutet das, dass generische Listen auch eine Typüberprüfung durchführen? (das scheint ein wenig unnötig)

BEARBEITEN Es könnte tatsächlich ein bisschen eleganter sein, das Muster zu

zu modifizieren %Vor%

Auf diese Weise können Sie die Anweisung flüssig verwenden und wenn keine Liste übergeben wird, können Sie einfach ein List & lt; Objekt & gt;

instanziieren     
Homde 12.11.2010, 13:02
quelle

4 Antworten

3

List<T> implementiert IList explizit. Die Implementierungen werden in T umgewandelt und die regulären (generischen) Methoden aufgerufen.

Die Typüberprüfung findet also nur statt, wenn Sie explizit die Methoden IList aufrufen. Zum Beispiel:

%Vor%

Es verwendet nicht das Schlüsselwort as , da% code_de% möglicherweise ein Werttyp ist.
Sie können T nur schreiben, wenn Sie as T geschrieben haben.

    
SLaks 12.11.2010, 13:04
quelle
1

Die Verwendung von IList ist in den meisten Fällen in Ordnung; und ist sicher schneller als die Verwendung von reflection oder dynamic , um dasselbe zu erreichen.

Ja, es wird eine Typ-Überprüfung hinzugefügt (aufgrund der Cast / Unbox), aber das wird nicht beschwerlich sein. Wenn T ein struct ist, dann hast du auch ein paar Boxen / Unboxing, aber das ist auch nicht so schlimm, wie die Leute befürchten.

In diesem Szenario wäre IList für mich in Ordnung.

    
Marc Gravell 12.11.2010 13:08
quelle
0

Ihre Lösung sieht gut aus, es ist nichts falsch daran.

In Bezug auf Add führt es keine Typprüfung durch. Der Code für den Add , auf den Sie verweisen, lautet wie folgt:

%Vor%

Es wird keine Typprüfung durchgeführt; es ist nur ein Versuch / fangen.

    
Pieter van Ginkel 12.11.2010 13:08
quelle
0

Ich mag den zweiten Ansatz.

Sie können die IList übergeben, aber dann den Typ prüfen, um festzustellen, ob es sich um eine generische Liste handelt, und wenn dies der Fall ist, rufen Sie den generischen Typ ab und laden nur Datensätze dieses Typs:

%Vor%     
Aliostad 12.11.2010 13:15
quelle

Tags und Links