AW: Generisches ToString für Enumerations
Zitat:
Zitat:
|
AW: Generisches ToString für Enumerations
Zitat:
Delphi unterstützt nämlich keine Typenparameter in einfachen Routinen. Zitat:
Dennoch kleine Korrektur:
Delphi-Quellcode:
denn AsString versucht, den Typen in einen string umzuwandeln, das wird fehlschlagen.
TValue.From<T>(Value).ToString
|
AW: Generisches ToString für Enumerations
Zitat:
Klassen sind dafür da um zum Beispiel diese Art von Code zu enthalten. (Vor allem, da es auch noch komplett statisch ist... o_O ) Es gibt natürlich immer sinnvolle Ausnahmen, aber genau das ist hier überhaupt nicht der Fall gewesen. Ich verbrachte nämlich beim lesen seines Beitrags etwas Zeit um rauszufinden, warum er es als Record deklarieren musste. Bis ich feststellte, dass es gar keinen Grund dafür gibt. Er hatte es einfach so gemacht, sozusagen eine Münze geworfen oder eine erhoffte Optimierung nach Cargo-Cult Style. Du gibst ja auch keiner Klasse einen I-Präfix, außer wenn es unbedingt, aus irgendeinem drastischen Grund, sein muss. Wenn du also eine Klasse mit einem I-Präfix siehst, wirst du wohl auch Zeit verbringen herauszufinden, warum der Autor das tun musste. Das gleiche gilt auch hier, nur 2 Nummern weniger dramatisch. |
AW: Generisches ToString für Enumerations
Zitat:
|
AW: Generisches ToString für Enumerations
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
Endet in einer Exception:
Result := TValue.From<String>(Value).AsType<T>;
Code:
Hatte jetzt aber keine Lust mehr da lange zu testen :stupid:
Im Projekt Project1.exe ist eine Exception der Klasse EInvalidCast mit der Meldung 'Ungültige Typumwandlung' aufgetreten.
Zitat:
|
AW: Generisches ToString für Enumerations
Zitat:
Zitat:
|
AW: Generisches ToString für Enumerations
Zitat:
|
AW: Generisches ToString für Enumerations
Zitat:
Delphi-Quellcode:
Wäre TValue eine Klasse, dann müsste man die Speicherverwaltung teilweise intern, ebenso aber auch extern durch den Programmierer vornehmen, dass immer alles passt und keine Speicherleaks entstehen. Klar, man könnte den Record (bzw. dann evtl. die Klasse) anders gestalten, aber was genau spricht gegen eine solche Verwendung?
TValue = record
public { ... } class function From<T>(const Value: T): TValue; static; { ... } end; Ich bin echt gerne bereit, meine Ansichten zu ändern, wie schon gesagt, aber ich verstehe den Grund, warum ich das tun sollte, nicht wirklich?! Ich habe extra nochmals auf Wikipedia nachgelesen, wofür Records (bzw. Structs) eigentlich da sind, aber nachdem deren Funktionalität erweitert wurde, sehe ich weniger Probleme darin auch deren Vorteile zu verwenden. |
AW: Generisches ToString für Enumerations
Zitat:
Übrigens: Du könntest auch einen record helper für TValue schreiben :) Und schau dir mal die Implementierung von TRttiEnumerationType.GetValue in der Rtti.pas an. |
AW: Generisches ToString für Enumerations
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
So, habe das ganze nun überarbeitet und um die Methoden
TApEnumerations = class
public class function EnumToStr<T>(const Value: T): String; static; class function StrToEnum<T>(const Value: String): T; static; class function SetToStr<T>(const Value: T): String; static; class function StrToSet<T>(const Value: String): T; static; end;
Delphi-Quellcode:
und
SetToStr<T>()
Delphi-Quellcode:
erweitert. Zudem habe ich hier nicht mehr den Anspruch die neue RTTI zu nutzen, da diese ja nur die alte RTTI-Methoden kapselt und so etwas langsamer ist -- klar, man kann hier drüber streiten, aber es soll hier um die Funktionalität gehen :)
StrToSet<T>()
Weiterhin habe ich den record durch class ersetzt, da ich wohl das Argument verstanden habe, warum ich hier eigentlich class verwenden sollte. In diesem Sinne, wettert drauf los :mrgreen: PS: Ich sollte noch sagen, dass StrToSet<T>() als Typen den set-Typen erwartet (z.B. TTestEnumSet) und als Parameter eine komma-separierte Aufzählung, die in eckigen Klammer platziert ist -- Beispiel:
Delphi-Quellcode:
. (ist quasi die Umkehrfunktion von SetToStr<T> -- wer hätte es gedacht ;) )
'[taOne, taTwo, taThree]'
-- Edit: Habe das ganze nun mal in eine Unit gepackt und in den Anhang gesteckt. Dadurch wird der Beitrag dezent übersichtlicher. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz