Asp.net mvc 3 为什么WebGrid使用动态格式?

Asp.net mvc 3 为什么WebGrid使用动态格式?,asp.net-mvc-3,dynamic,.net-4.0,lambda,webgrid,Asp.net Mvc 3,Dynamic,.net 4.0,Lambda,Webgrid,我正在ASP.NET MVC 3 Razor项目中使用System.Web.Helpers.WebGrid,我很难理解WebGridColumn的格式参数为什么是Func 如果我创建一个这样的列 grid.Column( format: x => string.Format("{0:d}", x.StartDate) ); grid.Column( format: (MyObjectType x) => string.Format("{0:d}", x.St

我正在ASP.NET MVC 3 Razor项目中使用
System.Web.Helpers.WebGrid
,我很难理解
WebGridColumn
的格式参数为什么是
Func

如果我创建一个这样的列

grid.Column(
    format: x => string.Format("{0:d}", x.StartDate)
    );
grid.Column(
    format: (MyObjectType x) => string.Format("{0:d}", x.StartDate)
    );
…我无法在StartDate属性上进行强键入。如果我试着这样绕过它

grid.Column(
    format: x => string.Format("{0:d}", x.StartDate)
    );
grid.Column(
    format: (MyObjectType x) => string.Format("{0:d}", x.StartDate)
    );
…在运行时,我被告知我的lambda不能强制转换为
Func
。有什么方法可以在这里使用非动态lambda吗?即使只是


(我在.NET 4.0中,
Func
应该是T上的逆变,但我不知道协方差和逆变如何与动态一起工作。)

就类型系统而言,
动态
对象
相同

它们不能使用强类型委托,因为它们没有要传递的强类型值

WebGrid
内部,他们从
PropertyDescriptor
获取
对象,并将其传递给您的代表


协方差在这里没有帮助;如果将
Func
转换为
Func
,则可以使用任何其他类型调用它并获得无效强制转换。

使用object可以获得无效强制转换,但使用dynamic,如果运行时
StartDate
不存在,则会出现错误。一个六个,另一个半打。但实际上,如果我将
StartDate
属性更改为,比如说,
InitialDate
,这个MVC视图将在运行时中断;即使我在编译时启用构建视图,我也无法检测到它。@Kyralessa:您可以强制转换委托:
x=>string.Format({0:d}),((YourType)x.StartDate)
只有在WebGridColumn的Format参数中,x作为WebGridRow结束,因此它必须是
x=>string.Format({0:d},((MyType)x.Value).StartDate)。相当可怕。可怕,而且在我看来,完全没有必要。为什么他们没有在
WebGrid
中使用泛型?@Kyralessa:允许它与
DataTable
等非泛型的东西一起使用。(或在泛型类中使用
IListSource