Delphi 如何将stringname设置为泛型的类<;T>;
我想更改stringname的名称。但我不知道这是否可行 我有:Delphi 如何将stringname设置为泛型的类<;T>;,delphi,generics,Delphi,Generics,我想更改stringname的名称。但我不知道这是否可行 我有: function TServerMethods1.GetCustomer(aId: string): TJsonValue; begin Result:= ToJson(TRepositoryDatabase<TCustomer>.CreateRepository(Factories.FireBirdConnection.TFireBirdConnectionFactory.CreateConnecion(cCo
function TServerMethods1.GetCustomer(aId: string): TJsonValue;
begin
Result:= ToJson(TRepositoryDatabase<TCustomer>.CreateRepository(Factories.FireBirdConnection.TFireBirdConnectionFactory.CreateConnecion(cConnectionString)).GetItem(aId));
end;
函数TServerMethods1.GetCustomer(aId:string):TJsonValue;
开始
结果:=ToJson(TRepositoryDatabase.CreateRepository(Factories.FireBirdConnection.TFireBirdConnectionFactory.createconnection(cConnectionString)).GetItem(aId));
结束;
这个很好用。
但是现在我想将TCustomer设置为param
function TServerMethods1.GetItem(aClassName, aId: string): TJsonValue;
var
oClass: TClass;
LCtx: TRttiContext;
LTp: TRttiType;
begin
try
LTp := LCtx.FindType(AClassName);
except
Exit;
end;
if (LTp <> nil) and (LTp is TRttiInstanceType) then
oClass := TRttiInstanceType(LTp).MetaclassType ;
If assigned(oClass)
then begin
Result:= ToJson(TRepositoryDatabase<oClass>.CreateRepository(Factories.FireBirdConnection.TFireBirdConnectionFactory.CreateConnecion(cConnectionString)).GetItem(aId));
end;
end;
函数TServerMethods1.GetItem(aClassName,aId:string):TJsonValue;
变量
类:TClass;
立法会十题:;
LTp:trtti型;
开始
尝试
LTp:=LCtx.FindType(AClassName);
除了
出口
结束;
如果(LTp nil)和(LTp为TrtInstanceType),则
oClass:=TRttiInstanceType(LTp).MetaclassType;
如果已分配(oClass)
然后开始
结果:=ToJson(TRepositoryDatabase.CreateRepository(Factories.FireBirdConnection.TFireBirdConnectionFactory.createconnection(cConnectionString)).GetItem(aId));
结束;
结束;
当我用oClass更改TCustomer时,我无法编译。
我得到[dcc32 Error]ServerMethodsUnit1.pas(115):E2003未声明的标识符:“TRepositoryDatabase”
TRepositoryDatabase <T: Class> = class(TRepositoryBase <T>, IRepository<T>)
private
FManager: TObjectManager;
public
constructor Create(aConnection: IDBConnection);
destructor Destroy; override;
procedure SaveItem(aItem: T); override;
function GetItem(Id: Variant): T; override;
function GetItems: TList <T>; override;
procedure DeleteItem(aItem: T); override;
class function CreateRepository (aConnection: IDBConnection): IRepository <T>;
end;
TRepositoryDatabase=class(TRepositoryBase,IRepository)
私有的
F经理:项目经理;
公众的
构造函数创建(A连接:IDBConnection);
毁灭者毁灭;推翻
程序保存项(aItem:T);推翻
函数GetItem(Id:Variant):T;推翻
函数GetItems:TList;推翻
程序删除项(aItem:T);推翻
类函数CreateRepository(A连接:IDBConnection):IRepository;
结束;
是否可以从stringname创建一个类并在generecs中设置它?除非您在编译时引用泛型类型,否则编译器不会实例化该类型。如果您想要运行时解析,那么编译时泛型是错误的工具。