2009-06-23 5 views
5

Je veux écrire dans Delphi (2009 - donc je classe le dictionnaire générique) quelque chose de similaire à ce code C#:L'alternative de classe .NET 'Type' dans Delphi

Dictionary<Type, Object> d = new Dictionary<Type, Object>(); 
d.Add(typeof(ISomeInterface), new SomeImplementation()); 
object myObject = d[typeof(ISomeInterface)]; 

Toutes les idées?

Merci à l'avance,

Hristo

Répondre

9

Pour les interfaces, vous aurez envie d'utiliser un pointeur PTypeInfo, qui est retourné par la fonction magique compilateur TypeInfo. PTypeInfo est déclaré dans l'unité TypInfo. Bien sûr, s'il s'agissait de classes au lieu d'interfaces, vous pourriez simplement utiliser une référence TClass.

+0

Merci, Mason. C'est la solution que je cherchais. Actuellement, je vais créer une implémentation simple du modèle de conception de registre et je veux que mon code ressemble à ceci: Registry.RegisterComponent (TSomeImplementation.Create); // ou peut-être même: RegisterComponent (TSomeImplementation); . . . ISomeInterface i: = Registry.GetComponent ; @ Uwe Raabe: Il est intéressant de savoir que c'est possible mais dans mon cas les interfaces n'ont pas de GUID. –

+0

En guise de remarque, j'étais à la conférence Delphi Live le mois dernier, et Barry Kelly a fait une présentation sur un nouveau modèle RTTI amélioré qui est censé être dans Delphi 2010. Il est beaucoup plus complet que le jeu de fonctions existant, et beaucoup plus facile à travailler. –

6

Si elle est en fait un TInterfaceDictionary vous pouvez l'écrire comme ceci:

type 
    TInterfaceDictionary = TObjectDictionary<TGUID, TObject>; 

Il est évident que cela nécessite un GUID pour chaque interface à utiliser.

En raison de la magie du compilateur vous pouvez l'utiliser tout simplement:

d.Add(ISomeInterface, TSomeImplementation.Create()); 

(Mason: désolé pour détourner l'exemple de code)

+0

Huh. Je n'avais pas pensé à ça. Oui, cela fonctionnera pour les interfaces avec les GUID, en particulier. –

Questions connexes