如何反思C++/CX中的对象?我知道如何获得它的类名(使用IInspectable),但我无法弄清楚如何获取它的属性列表或如何调用方法,如果我只有方法的名称(字符串)。我在这里和谷歌搜索了一个答案,但是我发现与WinRT的.NET层相关(System.Reflection命名空间似乎没有在C++/CX中可用)。WinRT Reflection(C++/CX)
回答
C++没有提供任何特定的API来反映WinRT类型,这些类型在CX兼容的元数据文件中完全定义,您可以使用CLR本机元数据API来读取它们的定义。有一个在
片断詹姆斯McNellis去年发布了一个完整的C++库CX反射
http://seaplusplus.com/2012/04/26/cxxreflect-native-reflection-for-the-windows-runtime/
即使大部分正常的.Net反射都不包含在.Net可用于WinRT应用程序的子集中。我在WinRT documentation中没有找到任何反射相关的类型。这意味着(除非我忽略了某些内容)反射不会被可用的API暴露。
虽然我不明白为什么它不应该可用。元数据在那里,应该足够了。
查看C++特定函数时,有函数RoGetMetaDataFile()
。似乎应该有可能使用它来获取元数据。但它是一个本地C++函数,而不是C++/CX。这意味着它不易使用(手动内存管理,...),我怀疑它将被允许在商店中的应用程序。
正如svick暗示的那样,您将类名称(从IInspectable :: GetRuntimeClassName中检索)传递给RoGetMetaDataFile。这将返回IMetaDataImport2。现在拨打IMetaDataImport2::FindTypeDefByName。这返回一个typedef标记。现在打电话给IMetaDataImport2::GetTypeDefProps,它会给你关于类型的属性。
从typedef属性中,可以检索其他信息 - 枚举方法/字段(如果它是接口/结构体(或枚举)),查找运行时类的类型(如果它是接口或类)等。
在我发布这个问题之前,我尝试过使用RoGetMetaDataFile,它不起作用(没有找到GetRuntimeClassName返回的类型)。 – Atamiri
GetRuntimeClassName返回的字符串是什么?什么错误被返回?你传递给RoGetMetaDataFile的参数是什么? –
而不是调用'FindTypeDefByName',可以使用'RoGetMetaDataFile'通过其最后一个输出参数返回的'mdTypeDef'吗? –
- 1. Silverlight reflection
- 2. Java Interface Reflection Alternatives
- 3. XAML For Reflection Effect
- 4. AS3(Pixelfumes Reflection Class)
- 5. C#Reflection - GetMethod
- 6. Reflection和WCF
- 7. Java - BigDecimal和Reflection
- 8. iPhone + JSON + Reflection
- 9. Java Reflection Imports
- 10. C#Reflection&Generics
- 11. NoSuchMethodException while using JAVA Reflection
- 12. 关于ComponentModel和Reflection
- 13. 什么是“monadic reflection”?
- 14. 在WinRT Metro App C#中,ConstructorInfo.ReflectedType在哪里?
- 15. GridLengthAnimation WinRT
- 16. .NET Reflection创建类属性
- 17. Swift Reflection映射属性
- 18. 在WinRT中
- 19. 在WinRT中
- 20. WinRT中的System.Security.Cryptography.ProtectedMemory
- 21. WinRT中的BindingGroup
- 22. C#:在WinRT中
- 23. WinRT Z-Index页
- 24. WinRT SQLite加密
- 25. 宏认可WinRT?
- 26. WinRT的ReviewTask
- 27. Winrt Wpf databinding
- 28. WinRT的MaskedTextBox
- 29. ShareMediaTask为WinRT
- 30. WinRT中的HttpUtility.HtmlDecode
系统命名空间下没有什么能比可从C++/CX。所有这些都是.Net特有的。 – svick