在 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,所以这两种情况都不是完全类型保存的。您将得到无效的转换异常或 运行时间绑定异常。