如何反思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. nBuilder Testdatagenerator和Reflection
- 3. C#Reflection&Generics
- 4. AS3(Pixelfumes Reflection Class)
- 5. C#Reflection - GetMethod
- 6. C#Reflection,assembly.load byte []
- 7. Java Interface Reflection Alternatives
- 8. Java Reflection Imports
- 9. Java - BigDecimal和Reflection
- 10. iPhone + JSON + Reflection
- 11. Reflection和WCF
- 12. scala reflection without typeOf
- 13. XAML For Reflection Effect
- 14. Jmock with reflection
- 15. 關於ComponentModel和Reflection
- 16. NoSuchMethodException while using JAVA Reflection
- 17. 什麼是「monadic reflection」?
- 18. iCarousel with per image reflection
- 19. Swift Reflection映射屬性
- 20. .NET Reflection創建類屬性
- 21. SQL Alchemy和CX_Oracle Reflection問題
- 22. actionscript3:reflection-class applied on rotationY
- 23. CreateDelegate而不是Reflection爲SetValue
- 24. 在WinRT Metro App C#中,ConstructorInfo.ReflectedType在哪裏?
- 25. winrt autoupdate
- 26. GridLengthAnimation WinRT
- 27. winrt - System.UnauthorizedAccessException
- 28. WinRT OnSuspending
- 29. WinRT HttpClient塊splashdrop
- 30. WinRT中的WeekNumber
系統命名空間下沒有什麼能比可從C++/CX。所有這些都是.Net特有的。 – svick