2009-06-23 21 views
5

voglio scrivere in Delphi (2009 - quindi devo generica classe dizionario) qualcosa di simile a quel codice C#:.NET 'Tipo' alternativa di classe in Delphi

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

Tutte le idee?

Grazie in anticipo,

Hristo

risposta

9

Per le interfacce, ti consigliamo di utilizzare un puntatore PTypeInfo, che viene restituito dal compilatore magia funzione di TypeInfo. PTypeInfo è dichiarato nell'unità TypInfo.

type 
    TInterfaceDictionary = TObjectDictionary<PTypeInfo, TObject>; 
var 
    d: TInterfaceDictionary; 
    myObject: TSomeImplementation; 
begin 
    d := TInterfaceDictionary.Create([doOwnsValues]); 
    d.Add(TypeInfo(ISomeInterface), TSomeImplementation.Create()); 
    myObject = d[TypeInfo(ISomeInterface)]; 
end; 

Naturalmente, se questo era classi invece di interfacce, si potrebbe utilizzare un riferimento TClass.

+0

Grazie, Mason. Questa è la soluzione che stavo cercando. In realtà creerò una semplice implementazione del modello di progettazione del Registro di sistema e desidero che il mio codice assomigli a qualcosa di simile: Registry.RegisterComponent (TSomeImplementation.Create); // o forse anche: RegisterComponent (TSomeImplementation); . . . ISomeInterface i: = Registry.GetComponent ; @ Uwe Raabe: È interessante sapere che questo è possibile ma nel mio caso le interfacce non hanno GUID. –

+0

Il mese scorso sono stato presente alla conferenza Delphi Live, e Barry Kelly ha presentato una presentazione su un nuovo modello RTTI avanzato che dovrebbe essere in Delphi 2010. È molto più completo del set di funzioni esistente e molto più facile da lavorare. –

6

Se si tratta in realtà di un TInterfaceDictionary si può scrivere in questo modo:

type 
    TInterfaceDictionary = TObjectDictionary<TGUID, TObject>; 

Ovviamente questo richiede un GUID per ogni interfaccia da utilizzare.

causa di qualche magia compilatore è possibile utilizzarlo semplicemente:

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

(Mason: Ci scusiamo per dirottare il codice di esempio)

+0

Huh. Non ci avevo pensato. Sì, questo funzionerà per le interfacce con GUID, in particolare. –

Problemi correlati