为什么WebGrid在格式化中使用动态?

时间:2011-05-05 17:34:38

标签: asp.net-mvc-3 dynamic .net-4.0 lambda webgrid

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

如果我创建这样的列......

grid.Column(
    format: x => string.Format("{0:d}", x.StartDate)
    );

...我没有在StartDate属性上强力输入。如果我试着像这样绕过它......

grid.Column(
    format: (MyObjectType x) => string.Format("{0:d}", x.StartDate)
    );

...我在运行时被告知我的lambda无法转换为Func<dynamic, object>。有什么方法可以在这里使用非动态lambda吗?即使它只是<object, object>

(我在.NET 4.0中,并且Func<in T, out TResult>应该是T的逆变,但我对协方差和逆变如何与动态一起工作感到困惑。)

1 个答案:

答案 0 :(得分:3)

就类型系统而言,dynamicobject相同。

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

WebGrid内,他们从Object获得PropertyDescriptor,并将其传递给您的代表。

协方差在这里没有用;如果Func<YourType, string>已转换为Func<object, string>,则可以使用任何其他类型调用它并获得无效的投射。