Como posso passar tipos anônimos como parâmetros para outras funções? Considere este exemplo:
var query = from employee in employees select new { Name = employee.Name, Id = employee.Id };
LogEmployees(query);
A variável query
aqui não tem um tipo forte. Como devo definir minha LogEmployees
função para aceitá-la?
public void LogEmployees (? list)
{
foreach (? item in list)
{
}
}
Em outras palavras, o que devo usar em vez de ?
marcas.
c#
function
parameters
anonymous-types
Saeed Neamati
fonte
fonte
Respostas:
Eu acho que você deveria fazer uma aula para esse tipo anônimo. Isso seria a coisa mais sensata a se fazer na minha opinião. Mas se você realmente não quiser, poderá usar a dinâmica:
Observe que isso não é fortemente digitado; portanto, se, por exemplo, Name mudar para EmployeeName, você não saberá que há um problema até o tempo de execução.
fonte
dynamic
uso. Eu realmente vim a calhar para mim. Obrigado :)Você pode fazer assim:
... mas você não poderá fazer muito com cada item. Você pode ligar para o ToString, mas não poderá usar (por exemplo)
Name
eId
diretamente.fonte
where T : some type
no final da primeira linha para restringir o tipo. Nesse ponto, porém, esperar um certo tipo de interface comum faria mais sentido esperar uma interface. :)where T : some type
com tipos anônimos, porém, como eles não implementar qualquer tipo de interface de ...Infelizmente, o que você está tentando fazer é impossível. Sob o capô, a variável de consulta é digitado para ser um
IEnumerable
de um tipo anônimo. Nomes de tipos anônimos não podem ser representados no código do usuário, portanto, não há como torná-los um parâmetro de entrada para uma função.Sua melhor aposta é criar um tipo e usá-lo como o retorno da consulta e depois passá-lo para a função. Por exemplo,
Nesse caso, porém, você está selecionando apenas um único campo; portanto, pode ser mais fácil selecionar o campo diretamente. Isso fará com que a consulta seja digitada como
IEnumerable
do tipo de campo. Nesse caso, nome da coluna.fonte
Equals
muda o comportamento. Ou seja, você tem que implementá-lo. (Eu sabia dessa discrepância, mas ainda conseguiu esquecê-lo durante uma refatoração.)Você não pode passar um tipo anônimo para uma função não genérica, a menos que o tipo de parâmetro seja
object
.Tipos anônimos destinam-se ao uso de curto prazo dentro de um método.
Do MSDN - Tipos anônimos :
(ênfase minha)
Atualizar
Você pode usar genéricos para alcançar o que deseja:
fonte
object
- oudynamic
; pobject
não é o mesmo que tornar um método genérico no tipo anônimo, conforme minha resposta.Normalmente, você faz isso com genéricos, por exemplo:
O compilador deve inferir o
T
quando você chamaMapEntToObj(query)
. Não tenho certeza do que você deseja fazer dentro do método, então não sei dizer se isso é útil ... o problema é que,MapEntToObj
ainda dentro, você não pode nomear o nomeT
- você pode:T
T
para fazer as coisasmas, além disso, é muito difícil manipular tipos anônimos - principalmente porque são imutáveis ;-p
Outro truque (ao extrair dados) é também passar um seletor - ou seja, algo como:
fonte
Você pode usar genéricos com o seguinte truque (conversão para o tipo anônimo):
fonte
"dinâmico" também pode ser usado para esse fim.
fonte
Em vez de passar um tipo anônimo, passe uma lista de um tipo dinâmico:
var dynamicResult = anonymousQueryResult.ToList<dynamic>();
DoSomething(List<dynamic> _dynamicResult)
DoSomething(dynamicResult);
Obrigado a Petar Ivanov !
fonte
Se você sabe que seus resultados implementam uma certa interface, você pode usá-la como tipo de dados:
fonte
Eu usaria
IEnumerable<object>
como tipo para o argumento. No entanto, não é um grande ganho para o elenco explícito inevitável. Felicidadesfonte