2009-06-23 11 views
5

chcę pisać w Delphi (2009 - więc mam rodzajowe klasa słownika) coś podobnego do tego kodu C#:.NET „Type” klasy alternatywa w Delphi

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

jakieś pomysły?

Dzięki z góry,

Hristo

Odpowiedz

9

Dla interfejsów, będziemy chcieli użyć wskaźnika PTypeInfo, który jest zwracany przez kompilator magicznej funkcji TypeInfo. PTypeInfo jest deklarowane w jednostce 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; 

Oczywiście, jeśli były to klasy zamiast interfejsów, można po prostu użyć odniesienia TClass.

+0

Dzięki, Mason. To jest rozwiązanie, którego szukałem. Rzeczywiście, utworzę prostą implementację wzorca projektowania Rejestru i chcę, aby mój kod wyglądał mniej więcej tak: Registry.RegisterComponent (TSomeImplementation.Create); // a może nawet: RegisterComponent (TSomeImplementation); . . . IsomeInterface i: = Registry.GetComponent ; @ Uwe Raabe: Ciekawe, że jest to możliwe, ale w moim przypadku interfejsy nie mają identyfikatora GUID. –

+0

Na marginesie, byłem na konferencji Delphi Live w zeszłym miesiącu, a Barry Kelly zaprezentował nowy ulepszony model RTTI, który powinien pojawić się w Delphi 2010. Jest on o wiele bardziej kompletny niż istniejący zestaw funkcji i dużo łatwiej pracować. –

6

Jeśli to jest rzeczywiście TInterfaceDictionary można napisać tak:

type 
    TInterfaceDictionary = TObjectDictionary<TGUID, TObject>; 

Oczywiście wymaga to GUID dla każdego interfejsu użyć.

Ze względu na pewne kompilatora magii można go użyć po prostu:

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

(Mason: przepraszam za porwanie przykładowy kod)

+0

Huh. Nie pomyślałem o tym. Tak, to będzie działać na interfejsy z identyfikatorami GUID. –

Powiązane problemy