如何获取声明为接口类型的对象的类信息

How to get classinfo of object declared as an interface type

我有一些接口类型的列表。为了调试,我想打印出列表中每个对象的底层 class 的名称:

import std.stdio, std.container;

interface IFace { }

class Foo : IFace { }
class Bar : IFace { }

unittest {
  SList!IFace list;
  list.insert(new Foo);
  list.insert(new Bar);

  foreach(obj ; list) writeln(obj.classinfo.name);
}

我希望

Foo

Bar

反而得到了

IFace

IFace

有没有办法在运行时从接口类型的变量中提取实现 class?

此外,如果 IFaceclass 而不是 interface,我 do 会得到预期的结果。为什么?

将接口转换为 Object 然后获取 typeid 或 classinfo:

foreach(obj ; list) writeln((cast(Object)obj).classinfo.name); 

应该 还检查转换中的 null 是否完全正确,或许可以创建一个辅助函数来执行此操作,但如果你确定所有接口都来自对象,调试没问题

需要这样做的原因是 D 接口不一定表示 D 对象,因此 class 名称实际上可能不可用。例如,它可能是在某些外部 DLL 中创建并通过接口访问的 COM 对象。 D 正在与之交谈的可能是 C++ class。或者更多,接口保持通用,因此它们可以充当通用...。好吧,以各种语言和样式编写的各种组件之间的接口。

这也是为什么转换为对象可能 return 为空:如果它是 C++ class,它将无法转换回 D Object

Furthermore, I do get the expected result if IFace is a class instead of an interface. Why?

A class 保证有一个具有 运行 时间类型信息的 D Object 基础,所以它只在那里工作。接口可以来自其他来源。