Ich versuche, ein Benutzersteuerelement zu erstellen, das jede generische Liste akzeptiert, damit ich es durchlaufen und einen CSV-Export erstellen kann. Ist es möglich, eine öffentliche Eigenschaft anzugeben, die einen beliebigen Typ annehmen kann? (d. h. List<Product>
, List<Customer>
, usw.) Wenn ja, wie?
Hier ist, was ich habe so weit wie die Utility-Methoden, die ich habe:
%Vor%Wenn Sie aus einer Liste von Objekten "CSV-Export erstellen" möchten, sollten Sie die Spalten mithilfe der Reflektion berechnen.
Es macht mehr Sinn, das Trennzeichen standardmäßig auf ein Komma zu setzen, und es ist sinnvoll, die Ausgabe einer initialen Kopfzeile optional zu machen. Es unterstützt jetzt auch Felder und einfache Eigenschaften durch Verwendung von Concat
:
Sie verwenden es dann für Kommas mit Trennzeichen:
%Vor%oder für einen anderen Begrenzer (z. B. TAB):
%Vor%Schreibe eine Liste in eine kommagetrennte CSV-Datei
%Vor%oder schreiben Sie es tabulatorgetrennt
%Vor%Wenn Sie komplexe Felder / Eigenschaften haben, müssen Sie sie aus den Auswahlklauseln herausfiltern.
Wenn Sie eine generische Lösung bevorzugen (dies stellt sicher, dass die Objekte vom selben Typ sind):
%Vor%Dieser enthält sowohl öffentliche Felder als auch öffentliche Eigenschaften.
Im Allgemeinen brauchen Sie bei der Reflektion nicht den Typ der Objekte in der Liste (Sie müssen nur annehmen, dass sie alle vom selben Typ sind).
Sie könnten einfach verwenden:
%Vor%Der grundlegende Prozess für das, was Sie tun möchten, lautet etwa:
GetType()
). Sie können den gleichen Algorithmus verwenden, um ein 2D-Array zu generieren (d. h. wenn das Steuerelement z. B. in tabellarischer / Rasterform etwas wie CSV anzeigen soll).
Das einzige Problem, das Sie möglicherweise haben, ist die Konvertierung von IEnumerables / Listen bestimmter Typen in IEnumerable. Verwenden Sie in diesen Fällen .Cast<object>
für Ihr spezifisches typisiertes Enumerable.
Sie verwenden Code von Ссылка
Sie müssen folgende Änderung an seinem Code vornehmen:
%Vor% Wenn Sie eine leere Liste unterstützen wollen, fügen Sie einen zweiten Parameter hinzu (zB Type type
), der den Typ des erwarteten Objekts darstellt, und verwenden Sie diesen anstelle von list.First (). GetType () .
Hinweis: Ich sehe nirgendwo anders in seinem Code, wo T referenziert wird, aber wenn ich es verpasst habe, findet der Compiler es für dich:)
Dies hat den Vorteil eines geringen Speicheraufwands, da es Ergebnisse liefert, wenn sie auftreten, anstatt eine massive Zeichenfolge zu erstellen. Sie können es verwenden wie:
%Vor%Ich bevorzuge die generische Lösung in der Praxis, also habe ich diese zuerst platziert.
Sie müssten so etwas tun:
%Vor%Aus einer C # -Ansicht ist das vollkommen in Ordnung. Wenn Sie jedoch Ihr Benutzersteuerelement in ASPX Markup deklarieren möchten, kann ein Benutzersteuerelement keine Typparameter auf Klassenebene enthalten. Dies ist nicht möglich:
%Vor%Wenn Ihr Benutzersteuerelement jetzt nur im Code-Behind und nicht im Markup erstellt wird, ist das in Ordnung:
%Vor% Wenn Sie Ihr Benutzersteuerelement in ASPX-Markup deklarieren möchten / möchten, sollten Sie am besten eine IEnumerable<object>
-Eigenschaft erstellen.
Um generische Eigenschaften zu haben, muss die Klasse auch generisch sein:
%Vor% Da IEnumerable
eine Basisklasse von IEnumerable<T>
ist, könnte jede korrekt geschriebene Klasse IEnumerable<T>
an eine Eigenschaft vom Typ IEnumerable
übergeben werden. Da es so klingt, als ob Sie nur an dem "ToString ()" -Teil und nicht am "T-Teil" interessiert sind, sollte IEnumerable
gut funktionieren.