Vous pouvez toujours enregistrer vos types dans un type de registre (géré par une liste de chaînes ou un dictionnaire) et créer une fonction usine pour retourner ensuite l'objet approprié. Malheureusement, vous devez savoir à l'avance de quels types vous auriez besoin. Quelque chose de similaire aux fonctions Delphi RegisterClass et FindClass (dans l'unité de classes). Ma pensée est de mettre le type de modèle générique dans la liste directement.
Un exemple d'utilisation possible:
RegisterCustomType('Integer',TSomeType<Integer>);
RegisterCustomType('String',TSomeType<String>);
if FindCustomType('Integer') <> nil then
O := FindCustomType('Integer').Create;
EDIT: Voici une implémentation spécifique simple en utilisant un TDictionary de Generics.Collections pour gérer le stockage de registre ... Je vais laisser cela en extraire utile méthodes comme un exercice simple pour le lecteur.
var
o : TObject;
begin
TypeDict := TDictionary<String,TClass>.Create;
TypeDict.Add('integer',TList<integer>);
if TypeDict.ContainsKey('integer') then
o := TypeDict.Items['integer'].Create;
if Assigned(o) then
ShowMessage(o.ClassName);
end;
Une autre EDIT: Je donne cette une a été pensée hier soir, et a découvert une autre technique que vous pouvez fusionner dans ce concept. Interfaces Voici un exemple de ne rien faire rapide, mais peut facilement être étendu:
TYPE
ITest = interface
['{0DD03794-6713-47A0-BBE5-58F4719F494E}']
end;
TIntfList<t> = class(TList<T>,ITest)
public
function QueryInterface(const IID: TGUID; out Obj): HRESULT; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
end;
procedure TForm1.Button7Click(Sender: TObject);
var
o : TObject;
fTestIntf : ITest;
begin
TypeDict := TDictionary<String,TClass>.Create;
TypeDict.Add('integer',TIntfList<integer>);
if TypeDict.ContainsKey('integer') then
o := TypeDict.Items['integer'].Create;
if Assigned(o) and Supports(o,ITest,fTestIntf) then
ShowMessage(o.ClassName);
end;
Bien sûr, vous auriez à mettre en œuvre les méthodes QueryInterface, _AddRef et _Release et étendre l'interface pour faire quelque chose de plus utile.
Quel genre de "choses" pensez-vous que vous seriez en mesure de faire avec l'objet que vous créez? –
Récupérez une interface. Cela fait partie d'un système de persistance. – TrespassersW
Qui a dit qu'il a une interface que vous pouvez "saisir"? Si vous en connaissez suffisamment le type pour savoir qu'il implémente une interface spécifique, vous en savez assez pour ne pas avoir besoin de faire ce que votre extrait de code ci-dessus fait. –