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。反序列化(xml);结束;结束<代码>代码我得到一个错误:[dcc32错误]umaninform.pas(68):E2250没有重载版本的“反序列化”可以用这些参数@Бааааааааааааааа107。你能对你的问题进行编辑,显示你的问题吗?我会看一下。谢谢。回答您的编辑:[dcc32错误]umaninform.pas(68):E2010不兼容类型:“TSupportedClass”和“Tcommon class”不起作用:(因为类of和类是不同的类,但我知道它在我的另一个项目中工作得很好…@Bаааааааааааааааааааа您可以描述。这可能是一个概念上的问题。您可能会考虑对类对象执行某些操作,您需要的是类定义该操作,而不是外部操作。
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;