Delphi通用运行时
我想多次从反序列化中获取泛型类。 我如何简化它 我知道我想要什么类,但我很懒,不想重复代码 样本:Delphi通用运行时,delphi,generics,runtime,deserialization,Delphi,Generics,Runtime,Deserialization,我想多次从反序列化中获取泛型类。 我如何简化它 我知道我想要什么类,但我很懒,不想重复代码 样本: procedure Do; var cl:tclass1; cl2:tclass2; ..... N classes; begin cl:=tserialization.deserialize<tclass1>(json/xml); try DoSmthWithMyClass(cl); finally cl.free; end;
procedure Do;
var
cl:tclass1;
cl2:tclass2;
..... N classes;
begin
cl:=tserialization.deserialize<tclass1>(json/xml);
try
DoSmthWithMyClass(cl);
finally
cl.free;
end;
clN:=tserialization.deserialize<tclassN>(json/xml);
try
DoSmthWithMyClass(clN);
finally
clN.free;
end;
end;
procedure-Do;
变量
cl:tclass1;
cl2:tclass2;
..... N类;
开始
cl:=t序列化.反序列化(json/xml);
尝试
DoSmthWithMyClass(cl);
最后
cl.free;
结束;
clN:=tserialization.deserialize(json/xml);
尝试
DoSmthWithMyClass(clN);
最后
clN.free;
结束;
结束;
如何反序列化类(例如循环中的类)?
我知道我想提前上什么课
更新:
实际代码和错误:
[dcc32 Error]umaninform.pas(68):E2250没有可以使用这些参数调用的重载版本的“反序列化”
for iSupportClass := Low(TSupportedClasses)
to high(TSupportedClasses) do
begin
if db.GetRef(SupportedClasses[iSupportClass].GetTableName, xml,
error) = 0 then
begin
//here an error
iClass := txmlserializer.Deserialize < SupportedClasses
[iSupportClass] > (xml);
end;
end;
对于iSupportClass:=低(tSupportdClass)
要高(支持类)做什么
开始
如果db.GetRef(SupportedClasses[iSupportClass].GetTableName,xml,
误差=0,则
开始
//这里有一个错误
iClass:=txmlserializer.Deserialize(xml);
结束;
结束;
这里是我做一些非常类似的事情的方式,假设所有类都有共同的祖先(在我的例子中是TQSI2Comon)
然后,您可以查看受支持的SupportedClasses数组—在您的例子中类似于
procedure Do;
var
iSupportedClass : TSupportedClasses;
iClass : TSupportedClass;
begin
for iSupportedClass := Low( TSupportedClasses) to High(TSupportedClasses)
iClass:=tserialization.deserialize<SupportedClasses[iSupportedClass]>(json/xml);
try
iClass.DoSmthWithMyClass; // this will be an inherited function
finally
iClass.free;
end;
end;
end;
procedure-Do;
变量
iSupportedClass:tsupportedClass;
iClass:TSupportedClass;
开始
对于iSupportedClass:=低(TSupportedClass)到高(TSupportedClass)
iClass:=tserialization.deserialize(json/xml);
尝试
iClass.DoSmthWithMyClass;//这将是一个继承的函数
最后
自由类;
结束;
结束;
结束;
显然,最后一位仅用于说明目的,未经测试,但其余部分为实际代码
编辑
未经测试的代码当然不起作用,因为泛型是编译时而不是运行时操作
相反,您可以创建一个类函数进行反序列化,如:
type
TQSI2Common = class
public
class function Deserialize : TQSI2Common; virtual; abstract;
//...
end;
type
TQSI2Example = class(TQSI2Common)
public
class function Deserialize : TQSI2Common; override;
end;
//....
class function TQSI2Example.Deserialize : TQSI2Common;
begin
Result := tserialization.deserialize<TQSI2Example>(json/xml);
end;
//....
procedure Do;
var
iSupportedClass : TSupportedClasses;
iClass : TSupportedClass;
begin
for iSupportedClass := Low( TSupportedClasses) to High(TSupportedClasses)
iClass:=SupportedClasses[iSupportedClass].Deserialize;
try
iClass.DoSmthWithMyClass; // this will be an inherited function
finally
iClass.free;
end;
end;
end;
类型
TQSI2Common=类
公众的
类函数反序列化:TQSI2Common;事实上的摘要
//...
结束;
类型
TQSI2Example=类(TQSI2Common)
公众的
类函数反序列化:TQSI2Common;推翻
结束;
//....
类函数TQSI2Example.反序列化:TQSI2Comon;
开始
结果:=tserialization.deserialize(json/xml);
结束;
//....
程序Do;
变量
iSupportedClass:tsupportedClass;
iClass:TSupportedClass;
开始
对于iSupportedClass:=低(TSupportedClass)到高(TSupportedClass)
iClass:=SupportedClasses[IsSupportedClass]。反序列化;
尝试
iClass.DoSmthWithMyClass;//这将是一个继承的函数
最后
自由类;
结束;
结束;
结束;
编辑2
在新问题中提供的上下文中,可以处理泛型,但它变得有点混乱。下面修改的类定义显示了这一点:
type
TQSI2Common = class // Note NOT a Generic
public
class function Deserialize : TQSI2Common; virtual; abstract;
//...
end;
type
TQSI2Example<T : class> = class(TQSI2Common) // note IS generic.
public
end;
type TFirms = class( TQSI2Example<TFirm> )
public
class function Deserialize : TQSI2Common; override;
end;
type TDiscounts = class( TRefTable<TDiscount> )
public
class function Deserialize : TQSI2Common; override;
end;
//....
class function TFirms.Deserialize : TQSI2Common; override;
begin
Result := tserialization.deserialize<TFirms>(json/xml);
end;
类型
TQSI2Common=class//Note非泛型
公众的
类函数反序列化:TQSI2Common;事实上的摘要
//...
结束;
类型
TQSI2Example=class(TQSI2Common)//注释是泛型的。
公众的
结束;
类型TFirms=class(TQSI2Example)
公众的
类函数反序列化:TQSI2Common;推翻
结束;
类型TDiscounts=类别(树型)
公众的
类函数反序列化:TQSI2Common;推翻
结束;
//....
类函数TFirms。反序列化:TQSI2Common;推翻
开始
结果:=tserialization.deserialize(json/xml);
结束;
等等。你已经问过一次这个问题了。你为什么又问?这个版本也好不到哪里去。完全不清楚你们到底想知道什么。这是一个问题的小版本。这是一个常见的问题。@David,我想在运行时将类类型…反序列化。动态。你没有让它变得更清晰。记住,我们只有这里的东西。我们根本没有背景。使用RTTI或注册表。我已经告诉过你很多次了。在你的最后一个问题中,你同意使用继承。下面是一个假设仍然正确的答案。谢谢。这就是我想要的!不,不幸的是它不起作用。这是我的代码:
code
对于iSupportClass:=如果db.GetRef(SupportedClasses[iSupportClass].GetTableName,xml,error),则从低(TSupportedClasses)到高(TSupportedClasses)开始=0然后开始//这里有一个错误iClass:=txmlserializer。反序列化type
TQSI2Common = class // Note NOT a Generic
public
class function Deserialize : TQSI2Common; virtual; abstract;
//...
end;
type
TQSI2Example<T : class> = class(TQSI2Common) // note IS generic.
public
end;
type TFirms = class( TQSI2Example<TFirm> )
public
class function Deserialize : TQSI2Common; override;
end;
type TDiscounts = class( TRefTable<TDiscount> )
public
class function Deserialize : TQSI2Common; override;
end;
//....
class function TFirms.Deserialize : TQSI2Common; override;
begin
Result := tserialization.deserialize<TFirms>(json/xml);
end;