Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Classen Typinfo GUID & Generics. Nicht eindeutig identifizierbar? (https://www.delphipraxis.net/200657-classen-typinfo-guid-generics-nicht-eindeutig-identifizierbar.html)

Sequitar 13. Mai 2019 00:42

Classen Typinfo GUID & Generics. Nicht eindeutig identifizierbar?
 
Delphi-Quellcode:
Class Procedure Tfactory.Reg(Cl: TClass);
Begin
  If Assigned(Fclassregister)
  Then
  Begin
    Var
    Info := Ptypeinfo(Cl.ClassInfo);
    If Assigned(Info)
    Then
      Try
        Var
        Guid := Info^.TypeData.GUID;
        Fclassregister.Reg(Guid, Cl);
      Finally
      End;
  End;
End;

Tfactory.Reg([taclass<String, String>, taclass<String, Byte>,
  taclass<String, Integer>, taclass<Byte, Byte>]);
Hallo, ich bin eben auf ein Problem mit der eindeutigen idenzifizierung meiner registrierten Klassen gestoßen..
Bisher hab ich in einem dictionary die paare (guid,class)registriert, wobei die guid wie oben dargestellt erzeugt/abgefragt wurde.
Ich ging davon aus,die seien systemweit eindeutig und daher besser geeignet als irgendwelche selbst erstellten strings etc ?

nun habe ich den fall, dass ich mehrerere generische klassen registrieren - und auch wieder abfragen will, aber hier scheinen die klassen guids immer gleich zu sein? jedenfalls werden bereits bestehende registrierungen dabei vom neuen generischen typ überschrieben...:?:pale:

wie kann ich nun auch solche generischen klassen eindeutig zuordnen. sonst hab ich bald chaos

mjustin 13. Mai 2019 08:22

AW: Classen Typinfo GUID & Generics. Nicht eindeutig identifizierbar?
 
Wie wird der Klasse eine GUID zugeordnet? (per Property, Annotation, Funktion...?)

Hat im Codebeispiel nur die generische "Basis"-Klasse taclass eine GUID?

Uwe Raabe 13. Mai 2019 08:48

AW: Classen Typinfo GUID & Generics. Nicht eindeutig identifizierbar?
 
Zitat:

Zitat von mjustin (Beitrag 1432047)
Wie wird der Klasse eine GUID zugeordnet? (per Property, Annotation, Funktion...?)

Es handelt sich bei GUID um eine Funktion des Typs TTypeData aus System.TypInfo.

Zitat:

Zitat von Sequitar (Beitrag 1432041)
Ich ging davon aus,die seien systemweit eindeutig und daher besser geeignet als irgendwelche selbst erstellten strings etc ?

Die Dokumentation dazu ist etwas sparsam, aber die Implementation lässt schließen, daß nur für Interface-Typen ein brauchbarer Wert dabei herauskommt. Da es sich bei TTypData um einen varianten Record handelt, wird der Speicher für die GUID bei anderen Typen für andere Dinge verwendet. Deswegen steht da wohl immer irgendwas drin, aber nur bei Interface-Typen ist das wirklich eine GUID.

Deinen Ansatz kannst du also getrost in die Tonne treten - nicht nur bei generischen Klassen.

jaenicke 13. Mai 2019 09:29

AW: Classen Typinfo GUID & Generics. Nicht eindeutig identifizierbar?
 
Du kannst die Registrierung über die PTypeInfo direkt machen. Da brauchst du keine GUID oder irgendetwas, der Pointer darauf reicht schon zur eindeutigen Identifizierung im Dictionary.

Sequitar 14. Mai 2019 01:18

AW: Classen Typinfo GUID & Generics. Nicht eindeutig identifizierbar?
 
Zitat:

Zitat von jaenicke (Beitrag 1432052)
Du kannst die Registrierung über die PTypeInfo direkt machen. Da brauchst du keine GUID oder irgendetwas, der Pointer darauf reicht schon zur eindeutigen Identifizierung im Dictionary.

Hm das wäre ja schön einfach. Ich werde das morgen mal testen. Vielen Dank

NB :ich brauche halt eine eindeutige - und am besten bereits automatisierte - Identifizierung, ohne dass ich jetzt ZB irgendwelche hash Funktionen dazugeben muss

Hält das auch bei generics Stand? Müsste ja eigentlich denn tbla<x> ist ja ein anderer Typ als tbla<y> soweit ich weiß... Also auch andere typinfo

Sequitar 14. Mai 2019 01:28

AW: Classen Typinfo GUID & Generics. Nicht eindeutig identifizierbar?
 
Zitat:

Zitat von mjustin (Beitrag 1432047)
Wie wird der Klasse eine GUID zugeordnet? (per Property, Annotation, Funktion...?)

Hat im Codebeispiel nur die generische "Basis"-Klasse taclass eine GUID?

Naja interfaces ordnet man ja gewöhnlich eine zu. Da ich bei PTypeInfo fündig geworden bin, nahm ich an dass klassen bereits eine von sich aus liefern würden.
Uwes Antwort dagegen schießt einen sinnvolle Verwendung jedoch aus, wenn das nur für Interfaces mit einer *echten * GUID hinterlegt ist

jaenicke 14. Mai 2019 02:43

AW: Classen Typinfo GUID & Generics. Nicht eindeutig identifizierbar?
 
Zitat:

Zitat von Sequitar (Beitrag 1432173)
Hält das auch bei generics Stand? Müsste ja eigentlich denn tbla<x> ist ja ein anderer Typ als tbla<y> soweit ich weiß... Also auch andere typinfo

Ja, genau.

Das funktioniert nur bei den diversen Typaliasen der einfachen Typen nicht. Zum Beispiel ist TDateTime ja eigentlich nur ein Fließkommawert und hat daher auch dessen Typinfo.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:11 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