Почему WebGrid использует динамическое в форматировании? - PullRequest
6 голосов
/ 05 мая 2011

Я работаю с System.Web.Helpers.WebGrid в проекте ASP.NET MVC 3 Razor и не могу понять, почему параметр формата для 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)
    );

... Во время выполнения мне говорят, что моя лямбда не может быть приведена к Func<dynamic, object>.Есть ли способ, как я могу использовать нединамическую лямбду здесь?Даже если это просто <object, object>?

(я нахожусь в .NET 4.0, а Func<in T, out TResult> должен быть контравариантным по отношению к T, но я не совсем понимаю, как ковариация и контравариантность работают с динамикой.)

1 Ответ

3 голосов
/ 05 мая 2011

Что касается системы типов, dynamic совпадает с object.

Они не могут использовать строго типизированный делегат, поскольку у них нет строго типизированного значения для передачи.

Внутри WebGrid они получают Object от PropertyDescriptor и передают его вашему делегату.

Ковариантность здесь не поможет; если бы Func<YourType, string> был преобразован в Func<object, string>, можно было бы вызвать его любым другим типом и получить недопустимое приведение.

...