在 Viewbag 中使用扩展方法
Use an extension method in a Viewbag
我有以下 DateTime 类型的扩展方法
public static class DateTimeHelper
{
public static DateTime ToCST(this DateTime dt)
{
TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(dt, cstZone);
return cstTime;
}
}
这在带有 DateTime 对象的控制器中工作正常,但在视图中我想在 ViewBag 中使用它,就像这样:
@ViewBag.PrioritySummary.UpdateDttm.ToCST();
我收到以下错误:
'System.DateTime' 不包含 'ToCST' 的定义
说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其在代码中的来源的更多信息。
异常详细信息:Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:'System.DateTime' 不包含 'ToCST' 的定义
来源错误:
第 8 行:DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(ViewBag.PrioritySummary.UpdateDttm, cstZone);
第 9 行:}
第 10 行:@ViewBag.PrioritySummary.UpdateDttm.ToCST();
如何在同一行中将 ViewBag 转换为 DateTime,以便应用扩展方法?
我试过:
@(DateTime)ViewBag.PrioritySummary.UpdateDttm.ToCST();
但这没有用。
您应该将表达式括在括号中:
@(((DateTime)ViewBag.PrioritySummary.UpdateDttm).ToCST());
并在视图的开头添加相应的 using
语句。
@using ...DateTimeHelper;
尝试这样的事情:
@((DateTime)(ViewBag.PrioritySummary)).UpdateDttm.ToCST();
大家好,感谢您的回答,
在我尝试了你的选择之后,我意识到这是一个'()'问题,
以下行对我来说很好。
@(((DateTime)(ViewBag.PrioritySummary).UpdateDttm).ToCST());
谢谢。
错误的根本原因是您不能对动态表达式使用扩展方法,因为它们是在编译时绑定的。由于 ViewBag
是动态的,因此整个表达式在 运行 时间绑定。当您强制转换为 DateTime
时,编译器可以绑定到静态方法。
另一个没有转换的选项是直接调用静态方法:
@DateTimeHelper.ToCST(ViewBag.PrioritySummary.UpdateDttm);
由于您使用的是 dynamic
,所以这两种情况都不是完全类型保存的。您将得到无效的转换异常或 运行时间绑定异常。
我有以下 DateTime 类型的扩展方法
public static class DateTimeHelper
{
public static DateTime ToCST(this DateTime dt)
{
TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(dt, cstZone);
return cstTime;
}
}
这在带有 DateTime 对象的控制器中工作正常,但在视图中我想在 ViewBag 中使用它,就像这样:
@ViewBag.PrioritySummary.UpdateDttm.ToCST();
我收到以下错误:
'System.DateTime' 不包含 'ToCST' 的定义 说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其在代码中的来源的更多信息。 异常详细信息:Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:'System.DateTime' 不包含 'ToCST' 的定义 来源错误: 第 8 行:DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(ViewBag.PrioritySummary.UpdateDttm, cstZone); 第 9 行:} 第 10 行:@ViewBag.PrioritySummary.UpdateDttm.ToCST();
如何在同一行中将 ViewBag 转换为 DateTime,以便应用扩展方法?
我试过:
@(DateTime)ViewBag.PrioritySummary.UpdateDttm.ToCST();
但这没有用。
您应该将表达式括在括号中:
@(((DateTime)ViewBag.PrioritySummary.UpdateDttm).ToCST());
并在视图的开头添加相应的 using
语句。
@using ...DateTimeHelper;
尝试这样的事情:
@((DateTime)(ViewBag.PrioritySummary)).UpdateDttm.ToCST();
大家好,感谢您的回答, 在我尝试了你的选择之后,我意识到这是一个'()'问题, 以下行对我来说很好。
@(((DateTime)(ViewBag.PrioritySummary).UpdateDttm).ToCST());
谢谢。
错误的根本原因是您不能对动态表达式使用扩展方法,因为它们是在编译时绑定的。由于 ViewBag
是动态的,因此整个表达式在 运行 时间绑定。当您强制转换为 DateTime
时,编译器可以绑定到静态方法。
另一个没有转换的选项是直接调用静态方法:
@DateTimeHelper.ToCST(ViewBag.PrioritySummary.UpdateDttm);
由于您使用的是 dynamic
,所以这两种情况都不是完全类型保存的。您将得到无效的转换异常或 运行时间绑定异常。