2011-09-26 71 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'嗎? –