Por que o WebGrid usa formatação dinâmica?
-
29-10-2019 - |
Pergunta
Estou trabalhando com o System.Web.Helpers.WebGrid
em um projeto ASP.NET MVC 3 Razor e estou tendo problemas para entender por que o parâmetro de formato para um WebGridColumn
é um Func<dynamic, object>
.
Se eu criar uma coluna como esta ...
grid.Column(
format: x => string.Format("{0:d}", x.StartDate)
);
... Não recebo uma digitação forte na propriedade StartDate.Se eu tentar contornar assim ...
grid.Column(
format: (MyObjectType x) => string.Format("{0:d}", x.StartDate)
);
... Sou informado em tempo de execução que meu lambda não pode ser convertido em um Func<dynamic, object>
.Existe alguma maneira de usar um lambda não dinâmico aqui?Mesmo que seja apenas <object, object>
?
(Estou no .NET 4.0 e Func<in T, out TResult>
deve ser contravariante em T, mas estou confuso sobre como a covariância e a contravariância funcionam com dinâmica.)
Solução
No que diz respeito ao sistema de tipos, dynamic
é igual a object
.
Eles não podem usar um delegado fortemente tipado porque não têm um valor fortemente tipado para passar.
Dentro do WebGrid
, eles obtêm um Object
de um PropertyDescriptor
e o passam para o seu delegado.
A covariância não ajudará aqui;tivesse Func<YourType, string>
convertido em Func<object, string>
, seria possível chamá-lo com qualquer outro tipo e obter um elenco inválido.