2009-06-23 9 views
5

quiero escribir en Delphi (2009 - así que tengo genérica clase diccionario) algo similar a ese código C#:El .NET 'Tipo' alternativa de clase en Delphi

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

¿Alguna idea?

Gracias de antemano,

Hristo

Respuesta

9

Para las interfaces, tendrá que utilizar un puntero PTypeInfo, que se devuelve por el compilador TypeInfo función mágica. PTypeInfo se declara en la unidad 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; 

Por supuesto, si se trataba de clases en lugar de las interfaces, es posible que utilices una referencia TClass.

+0

Gracias, Mason. Esta es la solución que estaba buscando. Actualmente voy a crear una implementación simple del patrón de diseño del Registro y quiero que mi código se vea así: Registry.RegisterComponent (TSomeImplementation.Create); // o tal vez incluso: RegisterComponent (TSomeImplementation); . . . ISomeInterface i: = Registry.GetComponent ; @ Uwe Raabe: Es interesante saber que esto es posible, pero en mi caso las interfaces no tienen GUID. –

+0

Como nota al margen, estuve en la conferencia Delphi Live el mes pasado, y Barry Kelly hizo una presentación sobre un nuevo modelo RTTI mejorado que se supone que estará en Delphi 2010. Es mucho más completo que el conjunto de funciones existente, y mucho más fácil trabajar con. –

6

Si en realidad es un TInterfaceDictionary puede escribir así:

type 
    TInterfaceDictionary = TObjectDictionary<TGUID, TObject>; 

Obviamente esto requiere un GUID para cada interfaz a utilizar.

Debido al poco de magia compilador que puede usarlo simplemente:

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

(Mason: lo siento por secuestrar el código de ejemplo)

+0

Huh. No había pensado en eso. Sí, esto funcionará para interfaces con GUID, específicamente. –

Cuestiones relacionadas