Альтернатива класса .NET 'Type' в Delphi - PullRequest
5 голосов
/ 23 июня 2009

Я хочу написать в Delphi (2009 - так у меня есть общий словарный класс) что-то похожее на этот код C #:

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

Есть идеи?

Заранее спасибо,

Христо

Ответы [ 2 ]

9 голосов
/ 23 июня 2009

Для интерфейсов вам нужно использовать указатель PTypeInfo, который возвращается магической функцией компилятора TypeInfo. PTypeInfo объявлен в модуле 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;

Конечно, если бы это были классы вместо интерфейсов, вы могли бы просто использовать ссылку на TClass.

6 голосов
/ 23 июня 2009

Если это на самом деле TInterfaceDictionary, вы можете написать это так:

type
  TInterfaceDictionary = TObjectDictionary<TGUID, TObject>;

Очевидно, что для каждого интерфейса требуется GUID.

Благодаря некоторой магии компилятора вы можете использовать его довольно просто:

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

(Мейсон: извините за кражу образца кода)

...