Hi,
ich versuche gerade eine über
WSDL importierte Klasse dynamisch auszulesen.
Sagen wir ich hab die Klasse und durch die
WSDL werden mir 200 Properties erzeugt die ich auslesen kann, ich hab aber 50 verschiedene WSDLs, bin aber schreibfaul
deshalb will ich nicht jede einzelne property ausschreiben, sondern über die
RTTI dynamisch laden lassen. Würde tasächlich auch schon klappen, wenn die Properties nicht vom Typ TRemotableXS wären (TXSstring, TXSFloat, TXSBoolean....). Ich bekomme aktuell die Pointer als String, hab aber keinen Peil wie ich die Zuweisung richtig machen kann. Folgenden Code hab ich schon. Zugegeben Copy Past aus Stackoverflow, aber ich verstehe was er tut
Delphi-Quellcode:
uses
...System.TypInfo, system.Rtti;
procedure TForm5.SpeedButton1Click(Sender: TObject);
var
I: Word;
lstringlist: TStringList;
lExport: TMyPropFullClass;
begin
...
for I := 0 to High(lExport.Data) - 1 do
begin
GetObjectProperties(lZeitExport.Data[I], lstringlist)
end;
...
end;
procedure TForm.GetObjectProperties(AObject: TObject; AList: TStrings);
var
ctx: TRttiContext;
rType: TRttiType;
rProp: TRttiProperty;
AValue: TValue;
sVal: string;
const
SKIP_PROP_TYPES = [tkUnknown, tkInterface];
begin
if not Assigned(AObject) and not Assigned(AList) then
Exit;
ctx := TRttiContext.create;
rType := ctx.GetType(AObject.ClassInfo);
for rProp in rType.GetProperties do
begin
if (rProp.IsReadable) and not(rProp.PropertyType.TypeKind in SKIP_PROP_TYPES) then
begin
AValue := rProp.GetValue(AObject);
if AValue.IsEmpty then
begin
sVal := 'nil';
end
else
begin
if AValue.Kind in [tkUString, tkString, tkWString, tkChar, tkWChar] then
sVal := QuotedStr(AValue.ToString)
else
sVal := AValue.ToString;
end;
AList.Add(rProp.Name + '=' + sVal);
end;
end;
end;
Die Ausgabe sieht dann aktuell so aus:
Code:
name=(TXSString @ 000000000854C700)
Nicht so dolle, ist aber auch klar, weil TValue.ToString ja keinen Plan von meiner TRemotableXS Klasse hat, ich haber aber keine Idee wie ich ihm beibringen soll das es ein TRemotableXS ist. Wie ich einen String in ein TRemotableXS bekomme weis ich, aber das ist ja leider nicht was hier gerade notwendig wäre. Ich bin auch noch relativ neu in der
RTTI Thematik, von dem her hoffe ich auf den ein oder anderen Kniff eines alten Hasen
Grüße
PJM