なぜこれがコンパイルされないのですか?
(カスタム JSON インターセプターからのコード)
procedure myproc(MyObject: TObject);
procedure test(C: TClass);
begin
var ctx := TRttiContext.Create;
var typ := ctx.GetType(C);
for var fld in typ.GetFields do
begin
if fld.Name = 'anyfield' then
begin
TObjectList<Fld.ClassType>.Create(True);
end;
end;
typ.Free;
ctx.Free;
end;
begin
Test( MyOrgObject );
end;
何か問題があります: TObjectList<Fld.ClassType>.Create(True);
何か案は ?ありがとうございました
OK、私が持っているものは:
procedure TqBitObjectListInterceptor.StringReverter(Data: TObject; Field, Arg: string);
begin
if (Data is TqBitLogsType) and (Field = 'Flogs') then
begin
TqBitLogsType(Data).Flogs := TObjectList<TqBitLogType>.Create(True);
end else
if (Data is TqBitPrefsType) and (Field = 'Flist') then
begin
TqBitPrefsType(Data).Flogs := TObjectList<TqBitPrefsType>.Create(True);
end else...
end;
など、同じコードを持つ Type/Field のペアごとに、 RTTI を使用して Data.Field を TObjectList に割り当てられるようにしたいと考えています。
procedure TqBitObjectListInterceptor.StringReverter(Data: TObject; Field, Arg: string);
function Convert(C: TClass; F: string): boolean;
if (Data is C) and (Field = F) then
begin
var ctx := TRttiContext.Create;
var typ := ctx.GetType(Data);
for var fld in typ.GetFields do
begin
if fld.Name = F then
begin
fld.SetValue( TObjectList<C>.Create(True) );
end;
TObjectList<C>.Create(True); <<<<<
end;
end;
typ.Free;
ctx.Free;
Result := True;
end;
begin
Convert(TqBitLogsType, 'Flogs');
Convert(TqBitPreferenceType, 'Flist');
end;
参考: https ://sourceforge.net/p/qbitvcl/code/HEAD/tree/trunk/
Unit : uqBitAPITypes.pas プロシージャ TqBitObjectListInterceptor.StringReverter(Data: TObject; Field, Arg: string);