Delphi中替代.NET的'Type'类

5

我希望用Delphi(2009年版本,因此我拥有通用字典类)编写类似于以下C#代码的内容:

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

有什么想法吗?

提前感谢,

Hristo

2个回答

9

对于接口,您需要使用一个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引用。

谢谢,梅森。这就是我一直在寻找的解决方案。 实际上,我将创建一个注册表设计模式的简单实现,我希望我的代码看起来像这样:Registry.RegisterComponent<ISomeInterface>(TSomeImplementation.Create); //或者甚至:RegisterComponent<ISomeInterface>(TSomeImplementation); . . . ISomeInterface i := Registry.GetComponent<ISomeInterface>;@ Uwe Raabe:很有趣,了解到这是可能的,但在我的情况下,接口没有 GUID。 - Hristo
顺便提一下,上个月我参加了Delphi Live会议,Barry Kelly做了一个关于新增强的RTTI模型的演讲,这个模型应该会在Delphi 2010中出现。它比现有的函数集更完整,而且更易于使用。 - Mason Wheeler

6

如果它确实是TInterfaceDictionary,你可以像这样编写:

type
  TInterfaceDictionary = TObjectDictionary<TGUID, TObject>;

显然,每个接口都需要使用GUID。

由于一些编译器的魔法,您可以非常简单地使用它:

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

(Mason: 对于劫持示例代码,我感到抱歉)


哦,我没有想到。是的,这将适用于具有 GUID 的接口。 - Mason Wheeler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接