如何在 C++/CX 中内省对象?我知道如何获取它的类名(使用 IInspectable),但是如果我只有方法的名称(字符串),我无法弄清楚如何获取它的属性列表或如何调用方法。我在这里和谷歌搜索了答案,但我发现与 WinRT 的 .NET 层有关(C++/CX 中似乎没有 System.Reflection 命名空间)。
3 回答
正如 svick 所暗示的,您将类名(从 IInspectable::GetRuntimeClassName 检索)交给 RoGetMetaDataFile。这将返回一个IMetaDataImport2。现在调用IMetaDataImport2::FindTypeDefByName。这将返回一个 typedef 标记。现在调用IMetaDataImport2::GetTypeDefProps它将为您提供有关类型的属性。
从 typedef 属性中,您可以检索其他信息 - 如果它是接口/结构(或枚举),则枚举方法/字段,查找运行时类的类型(如果它是接口或类)等。
C++ 不提供任何特定的 API 来反映 WinRT 类型,这些类型在 CX 兼容的元数据文件中完全定义,您可以使用 CLR 本机元数据 API 来读取它们的定义。有一个片段
James McNellis 去年发布了用于 CX 反射的完整 C++ 库
http://seaplusplus.com/2012/04/26/cxxreflect-native-reflection-for-the-windows-runtime/
甚至大多数正常的 .Net 反射也不包含在 WinRT 应用程序可用的 .Net 子集中。而且我在WinRT 文档中没有找到任何与反射相关的类型。这意味着(除非我忽略了什么)反射根本不会被可用的 API 公开。
虽然我不明白为什么它不应该可用。元数据在那里,应该足够了。
在查看特定于 C++ 的函数时,有 function RoGetMetaDataFile()
。似乎应该可以使用它来获取元数据。但它是本机 C++ 函数,而不是 C++/CX。这意味着它不容易使用(手动内存管理,……),我怀疑它会在商店中的应用程序中被允许。