【问题标题】:The .NET 'Type' class alternative in DelphiDelphi 中的 .NET 'Type' 类替代方案
【发布时间】:2010-11-05 03:41:15
【问题描述】:

我想用 Delphi(2009 - 所以我有通用字典类)编写类似于 C# 代码的东西:

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

有什么想法吗?

提前致谢,

Hristo

【问题讨论】:

    标签: delphi delphi-2009


    【解决方案1】:

    对于接口,您需要使用 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(TSomeImplementation.Create); //或者甚至:RegisterComponent(TSomeImplementation); . . . ISomeInterface i := Registry.GetComponent; @Uwe Raabe:有趣的是知道这是可能的,但在我的情况下,界面没有 GUID。
    • 附带说明一下,我上个月参加了 Delphi Live 会议,Barry Kelly 就应该在 Delphi 2010 中提供的一种新的增强型 RTTI 模型进行了演示。它比现有的功能集,并且更容易使用。
    【解决方案2】:

    如果它实际上是一个 TInterfaceDictionary 你可以这样写:

    type
      TInterfaceDictionary = TObjectDictionary<TGUID, TObject>;
    

    显然,这需要每个界面使用一个 GUID。

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

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

    (Mason:很抱歉劫持了示例代码)

    【讨论】:

    • 嗯。我没有想到这一点。是的,这特别适用于带有 GUID 的接口。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多