Comment puis-je passer des types anonymes comme paramètres à d'autres fonctions? Prenons cet exemple:
var query = from employee in employees select new { Name = employee.Name, Id = employee.Id };
LogEmployees(query);
La variable query
ici n'a pas de type fort. Comment définir ma LogEmployees
fonction pour l'accepter?
public void LogEmployees (? list)
{
foreach (? item in list)
{
}
}
En d'autres termes, que dois-je utiliser à la place des ?
marques.
c#
function
parameters
anonymous-types
Saeed Neamati
la source
la source
Réponses:
Je pense que vous devriez créer une classe pour ce type anonyme. Ce serait la chose la plus sensée à faire à mon avis. Mais si vous ne voulez vraiment pas, vous pouvez utiliser la dynamique:
Notez que ce n'est pas fortement typé, donc si, par exemple, Name change en EmployeeName, vous ne saurez pas qu'il y a un problème avant l'exécution.
la source
dynamic
utilisation. J'ai vraiment été utile pour moi. Merci :)Vous pouvez le faire comme ceci:
... mais vous ne pourrez pas faire grand-chose avec chaque élément. Vous pouvez appeler ToString, mais vous ne pourrez pas utiliser (par exemple)
Name
etId
directement.la source
where T : some type
à la fin de la première ligne pour affiner le type. À ce stade, cependant, s'attendre à un certain type d'interface commune aurait plus de sens d'attendre une interface. :)where T : some type
avec des types anonymes, car ils n'implémentent aucun type d'interface ...Malheureusement, ce que vous essayez de faire est impossible. Sous le capot, la variable de requête est typée pour être un
IEnumerable
type anonyme. Les noms de types anonymes ne peuvent pas être représentés dans le code utilisateur, il n'y a donc aucun moyen d'en faire un paramètre d'entrée dans une fonction.Votre meilleur pari est de créer un type et de l'utiliser comme retour de la requête, puis de le transmettre à la fonction. Par exemple,
Dans ce cas cependant, vous ne sélectionnez qu'un seul champ, il peut donc être plus facile de sélectionner le champ directement. Cela entraînera la saisie de la requête en tant que type
IEnumerable
de champ. Dans ce cas, nom de la colonne.la source
Equals
change le comportement. Ie vous devez le mettre en œuvre. (Je connaissais cet écart mais j'ai quand même réussi à l'oublier lors d'un refactoring.)Vous ne pouvez pas passer un type anonyme à une fonction non générique, sauf si le type de paramètre est
object
.Les types anonymes sont destinés à une utilisation à court terme dans une méthode.
Depuis MSDN - Types anonymes :
(c'est moi qui souligne)
Mettre à jour
Vous pouvez utiliser des génériques pour réaliser ce que vous voulez:
la source
object
- ordynamic
; pobject
n'est pas la même chose que rendre une méthode générique de type anonyme, selon ma réponse.Normalement, vous faites cela avec des génériques, par exemple:
Le compilateur doit alors déduire le
T
moment où vous appelezMapEntToObj(query)
. Je ne sais pas trop ce que vous voulez faire à l'intérieur de la méthode, donc je ne peux pas dire si cela est utile ... le problème est qu'à l'intérieurMapEntToObj
vous ne pouvez toujours pas nommer leT
- vous pouvez non plus:T
T
pour faire des chosesmais à part ça, il est assez difficile de manipuler les types anonymes - notamment parce qu'ils sont immuables ;-p
Une autre astuce (lors de l' extraction de données) est de passer également un sélecteur - c'est-à-dire quelque chose comme:
la source
Vous pouvez utiliser des génériques avec l'astuce suivante (conversion en type anonyme):
la source
«dynamique» peut également être utilisé à cette fin.
la source
Au lieu de passer un type anonyme, passez une List d'un type dynamique:
var dynamicResult = anonymousQueryResult.ToList<dynamic>();
DoSomething(List<dynamic> _dynamicResult)
DoSomething(dynamicResult);
Merci à Petar Ivanov !
la source
Si vous savez que vos résultats implémentent une certaine interface, vous pouvez utiliser l'interface comme type de données:
la source
J'utiliserais
IEnumerable<object>
comme type pour l'argument. Cependant, ce n'est pas un grand gain pour l'incontournable casting explicite. À votre santéla source