如何在C++/WinRT中获取类型的TypeName以实现ICustomPropertyProvider::Type()?
获取C++/WinRT中符合XAML要求的TypeName以实现ICustomPropertyProvider::Type()
我太懂你从C++/CX转C++/WinRT时的这种困惑了——这俩技术在类型信息获取上的API差异确实让人头疼。你提到的标准typeid()确实不适合XAML场景,它返回的字符串是编译器相关的,完全不遵循WinRT的类型命名规范,根本没法被XAML正确识别。
在C++/WinRT里,你得用**winrt::get_typename<T>()**这个专门的工具函数,它能返回符合要求的winrt::TypeName结构体,正好是ICustomPropertyProvider::Type()方法需要的返回类型。
代码示例
假设你正在实现自定义类的ICustomPropertyProvider接口,Type()方法可以这么写:
#include <winrt/Windows.Foundation.h> winrt::TypeName MyCustomType::Type() const { // 获取当前类的标准WinRT类型信息 return winrt::get_typename<MyCustomType>(); }
为什么这个方法管用?
winrt::get_typename<T>()是C++/WinRT为WinRT类型系统量身打造的函数,返回的winrt::TypeName结构体包含两个关键成员:
Kind:标记类型的类别(比如winrt::TypeKind::Class、winrt::TypeKind::Struct、winrt::TypeKind::Primitive等)Name:WinRT类型的完整规范名称(例如"MyNamespace.MyCustomType",泛型类型会自动处理成"Windows.Foundation.IAsyncOperation1"`这类标准格式)
这个返回值完美匹配XAML对ICustomPropertyProvider::Type()的要求,作用和C++/CX里的T::typeid或Object::GetType()完全一致,但更贴合C++/WinRT的原生语法。
额外小提示
如果需要获取某个实例的类型信息,也可以用非模板版本的winrt::get_typename():
auto obj = winrt::make<MyCustomType>(); winrt::TypeName typeName = winrt::get_typename(obj);
内容的提问来源于stack exchange,提问作者jvdh
相关产品推荐
相关产品推荐

