根据WinRT规范,私有类应覆盖IInspectable::GetRuntimeClassName()并返回不同的名称(或NULL)。但是由于IInspectable
不是ref类(它是一个结构),所以我不能从它继承或重写这些方法。
从MSDN定义:
HRESULT GetRuntimeClassName(
[out] HSTRING *className
);
所以问题是,如何为WinRT(ref)类覆盖
IInspectable::GetRuntimeClassName()
?尝试示例:
#include "Hstring.h"
#include "Inspectable.h"
#include <sal.h>
namespace PhoneVoIPApp
{
namespace BackEnd
{
namespace CallController
{
public interface class IHelloWorld
{
Platform::String^ SayHello();
};
private ref class HelloWorldImpl sealed :IHelloWorld
{
public:
virtual Platform::String^ SayHello();
virtual HRESULT GetRuntimeClassName(_Out_ HSTRING *className) override;
};
Platform::String^ HelloWorldImpl::SayHello()
{
return L"Hello World!";
}
HRESULT HelloWorldImpl::GetRuntimeClassName(_Out_ HSTRING *className)
{
*className = nullptr;
return E_NOTIMPL;
}
}
}
}
最佳答案
我与CLR小组进行了交谈,他们为我指出了正确的答案。
使用私有类时,可以将秘密的未记录属性Platform::Metadata::RuntimeClassName
添加到代码中。
因此,解决该问题的方法是:
#include "Hstring.h"
#include "Inspectable.h"
#include <sal.h>
namespace PhoneVoIPApp
{
namespace BackEnd
{
namespace CallController
{
public interface class IHelloWorld
{
Platform::String^ SayHello();
};
private ref class HelloWorldImpl sealed : [Platform::Metadata::RuntimeClassName]IHelloWorld
{
public:
virtual Platform::String^ SayHello();
};
Platform::String^ HelloWorldImpl::SayHello()
{
return L"Hello World!";
}
}
}
}
关于c++ - 如何为WinRT(ref)类覆盖IInspectable::GetRuntimeClassName(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21309802/