'System.DateTime'不是有效的Windows运行时参数类型

Nie*_*els 15 c# windows-runtime windows-store-apps

我正在使用C#类,它在我的Windows应用商店应用程序(C#)中运行得非常好.但是当我尝试在Windows运行时Compenent中使用它时,我收到以下错误:

Calculator.Calculate(System.DateTime)'具有'System.DateTime'类型的参数'dateTime'.'System.DateTime'不是有效的Windows运行时参数类型.

类中的示例对象:

public DateTime Calculate(DateTime dateTime)
{
   int dayNumberOfDateTime = ExtractDayNumber(dateTime);
   int sunRiseInMinutes = CalculateSunRiseInternal(tanSunPosition, differenceSunAndLocalTime);
   return CreateDateTime(dateTime, sunRiseInMinutes);
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?问题是什么?

Han*_*ant 29

创建Windows运行时组件时,您的组件可以由未管理的语言(如Javascript或C++)使用.显然,这些语言不知道如何生成适当的System.DateTime,它是一种特定的.NET类型.

因此,此类组件必须仅使用本机WinRT类型,否则必须遵守WinRT中存在的限制.您将从一开始就遇到的一个限制是WinRT不支持实现继承.这要求您宣布您的课程密封.

本机WinRT类型与.NET类型非常不同.可以存储日期的实际运行时类型是Windows.Foundation.DateTime.字符串实际上是一个HSTRING句柄.List实际上是一个IVector.等等.

毋庸置疑,如果您实际上必须使用这些本机类型,那么您的程序将不再像.NET程序.你不这样做,CLR的.NET 4.5版本内置了一个语言投影.代码可以自动将WinRT类型转换为等效的.NET类型.那个翻译有一些粗糙的边缘,有些类型不容易被替换.但绝大多数人都没有遇到麻烦.

System.DateTime就是这样一个粗糙的边缘.Windows.Foundation.DateTime的语言投影是System.DateTimeOffset.因此,只需通过声明您的方法来解决您的问题:

public DateTimeOffset Calculate(DateTimeOffset dateTime) {
    // etc..
}
Run Code Online (Sandbox Code Playgroud)

值得注意的另一点是,只有其他代码可能使用的成员才需要这样做.公共成员.