Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi TValue, Records und class operatoren (https://www.delphipraxis.net/193437-tvalue-records-und-class-operatoren.html)

Mavarik 31. Jul 2017 11:26

TValue, Records und class operatoren
 
Hallo Zusammen!

Gibt es einen Trick um aus einen TValue Wert der ein Record ist eine Zuweisung über einen Class operator auszuführen?

Delphi-Quellcode:
TFoo = Record
         Wert : String;
         Class operator implicit (AFoo : TFoo) : String;
       end;
Delphi-Quellcode:
S := Value.AsString; // über den Class operator...
Ich kenne den Typ des Records nicht... Da ich ihn ohne weitere Infos aus eine Klasse mit Field.GetValue geholt habe.

Grüsse Mavarik

Stevie 31. Jul 2017 11:50

AW: TValue, Records und class operatoren
 
Nur mal so hingeschludert:

Delphi-Quellcode:
function GetStringFromRecordImplicit(const v: TValue): string;
var
  ctx: TRttiContext;
  m: TRttiMethod;
  params: TArray<TRttiParameter>;
begin
  for m in ctx.GetType(v.TypeInfo).GetMethods do
    if (m.MethodKind = mkOperatorOverload)
      and SameText(m.Name, '&op_Implicit')
      and Assigned(m.ReturnType) and (m.ReturnType.Handle = TypeInfo(string)) then
    begin
      params := m.GetParameters;
      if (Length(params) = 1) and (params[0].ParamType.Handle = v.TypeInfo) then
        Exit(m.Invoke(nil, [v]).AsString);
    end;

  raise EInvalidOpException.Create('matching implicit operator not found');
end;
In 10.2 funktioniert das - ich erinner mich, dass es in einer älteren Version noch ein Problem mit Invoke bei class operators gab.

Mavarik 31. Jul 2017 11:59

AW: TValue, Records und class operatoren
 
Super Danke... Funktioniert.

Man könnte es ja ggf. mit einer normalen Methode machen nach dem Motto "Function ToString : String" suchen...

aber das "&op_Implicit" muss man natürlich wissen....

Mavarik


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz