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.)

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top