如何在 WinRT + C++/CX 中检查对象(包括盒装标量)的类型
How to check the type of an Object (including boxed scalar) in WinRT + C++/CX
我有一个 C# 函数,它 returns 一个任意对象(可以是字符串、字典或任何其他 class,包括盒装数字)例如
public static Object foo() {
return 3.14;
}
在 WinRT 上从 C++/CX 调用时,我如何知道检查返回对象的类型?我不明白为什么这不起作用:
if (result->GetType() == String::typeid)
if (result->GetType() == double::typeid)
if (result->GetType()->Equals(double::typeid))
这对 "real" 个对象有效:
auto temp = dynamic_cast<String^>(result);
if (temp) {
...
}
但我无法弄清楚如何处理盒装号码的情况,因为 dynamic_cast<Double>(result)
是不可能的。
PS:我看到了这个 similar question 但它不包括盒装号码的情况。
经过相当多的谷歌搜索后,我找到了这个解决方案,但我不知道这是否合适:
Object^ result = ...
if (dynamic_cast<IBox<double>^>(result)) {
auto value = safe_cast<double>(result);
...
}
auto string = dynamic_cast<String^>(result);
if (string) {
auto value = _PlatformStringToString(string);
...
}
我有一个 C# 函数,它 returns 一个任意对象(可以是字符串、字典或任何其他 class,包括盒装数字)例如
public static Object foo() {
return 3.14;
}
在 WinRT 上从 C++/CX 调用时,我如何知道检查返回对象的类型?我不明白为什么这不起作用:
if (result->GetType() == String::typeid)
if (result->GetType() == double::typeid)
if (result->GetType()->Equals(double::typeid))
这对 "real" 个对象有效:
auto temp = dynamic_cast<String^>(result);
if (temp) {
...
}
但我无法弄清楚如何处理盒装号码的情况,因为 dynamic_cast<Double>(result)
是不可能的。
PS:我看到了这个 similar question 但它不包括盒装号码的情况。
经过相当多的谷歌搜索后,我找到了这个解决方案,但我不知道这是否合适:
Object^ result = ...
if (dynamic_cast<IBox<double>^>(result)) {
auto value = safe_cast<double>(result);
...
}
auto string = dynamic_cast<String^>(result);
if (string) {
auto value = _PlatformStringToString(string);
...
}