2011-09-26 78 views
4

如何反思C++/CX中的对象?我知道如何获得它的类名(使用IInspectable),但我无法弄清楚如何获取它的属性列表或如何调用方法,如果我只有方法的名称(字符串)。我在这里和谷歌搜索了一个答案,但是我发现与WinRT的.NET层相关(System.Reflection命名空间似乎没有在C++/CX中可用)。WinRT Reflection(C++/CX)

+6

系统命名空间下没有什么能比可从C++/CX。所有这些都是.Net特有的。 – svick

回答

1

即使大部分正常的.Net反射都不包含在.Net可用于WinRT应用程序的子集中。我在WinRT documentation中没有找到任何反射相关的类型。这意味着(除非我忽略了某些内容)反射不会被可用的API暴露。

虽然我不明白为什么它不应该可用。元数据在那里,应该足够了。

查看C++特定函数时,有函数RoGetMetaDataFile()。似乎应该有可能使用它来获取元数据。但它是一个本地C++函数,而不是C++/CX。这意味着它不易使用(手动内存管理,...),我怀疑它将被允许在商店中的应用程序。

+0

公平地确定它实际上是RoGetMetaDataFile()来获取IMetaDataImport2接口指针。它是一个本地函数不是问题,C++/CX生成本地代码。 –

+1

在应用商店的应用中不允许进行对象自省。苹果确实允许它。 – Atamiri

+0

至于RoGetMetaDataFile,我可以将它与外部组件的类(我在另一个项目中创建了一个DLL)一起使用,但不能与我调用RoGetMetaDataFile的同一项目中的类一起使用。我不认为这是有意的行为,显然我错误地使用了RoGetMetaDataFile,或者它是早期预览中的错误。 – Atamiri

5

正如svick暗示的那样,您将类名称(从IInspectable :: GetRuntimeClassName中检索)传递给RoGetMetaDataFile。这将返回IMetaDataImport2。现在拨打IMetaDataImport2::FindTypeDefByName。这返回一个typedef标记。现在打电话给IMetaDataImport2::GetTypeDefProps,它会给你关于类型的属性。

从typedef属性中,可以检索其他信息 - 枚举方法/字段(如果它是接口/结构体(或枚举)),查找运行时类的类型(如果它是接口或类)等。

+0

在我发布这个问题之前,我尝试过使用RoGetMetaDataFile,它不起作用(没有找到GetRuntimeClassName返回的类型)。 – Atamiri

+2

GetRuntimeClassName返回的字符串是什么?什么错误被返回?你传递给RoGetMetaDataFile的参数是什么? –

+1

而不是调用'FindTypeDefByName',可以使用'RoGetMetaDataFile'通过其最后一个输出参数返回的'mdTypeDef'吗? –