De retour de type anonyme en C#
J'ai une requête qui retourne un type anonyme et la requête est dans une méthode. Comment pouvez-vous écrire ceci:
public "TheAnonymousType" TheMethod(SomeParameter)
{
using (MyDC TheDC = new MyDC())
{
var TheQueryFromDB = (....
select new { SomeVariable = ....,
AnotherVariable = ....}
).ToList();
return "TheAnonymousType";
}
}
- Pourquoi voudriez-vous revenir un type anonyme? Comment pourriez-vous utiliser ce résultat n'importe où ailleurs?
- double possible de Comment puis-je retourner un type anonyme à partir d'une méthode?
- que faire si vous êtes de retour json ou quelque chose où le type c# n'a pas d'importance
- Si vous êtes de retour JSON je voudrais (MVC) retour que comme un
JsonResult
. Type anonyme ont leur place, mais je trouve que je ne les utiliser que dans les méthodes. Quand j'ai dû retourner un non-typés d'objet, je serais d'utiliserdynamic
-, et ces cas sont rares. - Je l'ai utilisé dans l'api web, et oui avec la dynamique. Je vais vous avouer qu'il n'a pas un grand avantage et n'est généralement pas la peine, il suffit de pointer une utilisation pour elle
- Je ne pense pas que cette question est hors de la raison. J'ai vraiment besoin de faire cela à plusieurs reprises. Ses plus évident lors de l'utilisation d'entity framework et que vous voulez faire de votre requête dans une fonction et d'en utiliser les résultats dans plusieurs endroits. J'ai besoin de cette très souvent lors de l'affichage des résultats sur l'écran et ainsi d'avoir à utiliser les mêmes résultats dans un rapport ou lors de l'exportation vers excel. La requête peut contenir beaucoup de filtres et à l'INTERFACE utilisateur. vous ne voulez pas vraiment à créer la même requête dans plusieurs endroits ou vous pouvez facilement sortir de la synchronisation quand vous voulez pour ajouter les résultats
- Double Possible de Est-il un moyen de revenir Anonyme de Type de méthode?
- c-sharpcorner.com/UploadFile/pranayamr/...
- Personnellement, je trouve qu'il est utile lors du retour d'une couche de service pour mon contrôleur de couche pour éviter de créer de nouvelles, mais sliiiiightly différents modèles. Si je voulais avoir un objet de retour d'une entreprise que j'aimerais que le miroir de mon entité. Et je préfère éviter de créer des lots de CompanyWith{SpecialScenario}Dto.cs ils sont des objets pour être utilisé une fois avec peu de valeur.
- Sorte de réponse, compte tenu de certaines contraintes, peut être trouvé ici: stackoverflow.com/a/58560612/286406
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas.
Vous ne pouvez retourner
object
, ou d'un conteneur d'objets, par exempleIEnumerable<object>
,IList<object>
, etc.dynamic
. Qui le rend un peu plus facile de travailler avec.Vous pouvez retourner
dynamic
qui vous donnera un runtime version vérifiée de la anonyme de type, mais seulement dans .NET 4+Vous ne pouvez pas retourner les types anonymes. Pouvez-vous créer un modèle qui peut être retourné? Sinon, vous devez utiliser un
object
.Voici un article écrit par Jon Skeet sur le sujet
Code de l'article:
Ou, voici un autre article similaire
Ou, comme le sont les autres commentaires, vous pouvez utiliser
dynamic
En C# 7 on peut utiliser les tuples pour ce faire:
Vous pourriez avoir besoin d'installer
System.ValueTuple
package nuget bien.Vous pouvez utiliser le n-uplet de la classe comme un substitut pour un type anonyme lors d'un retour est nécessaire:
Note: n-uplet peut avoir jusqu'à 8 paramètres.
Ou, pour l'exemple de l'original post:
http://msdn.microsoft.com/en-us/library/system.tuple(v=vs. 110).aspx
Compilateur C# est un deux phases du compilateur. Dans la première phase, il vérifie juste les espaces de noms, les hiérarchies de classe, signatures de Méthode etc. Le corps de méthode sont compilées uniquement au cours de la deuxième phase.
Les types anonymes ne sont pas déterminé jusqu'à ce que le corps de la méthode est compilé.
De sorte que le compilateur n'a aucun moyen de déterminer le type de retour de la méthode au cours de la première phase.
C'est la raison pour laquelle les types anonymes ne peuvent pas être utilisés comme type de retour.
Comme d'autres l'ont suggéré, si vous êtes en utilisant .net 4.0 ou d'une râpe, vous pouvez utiliser
Dynamic
.Si j'étais vous, je serais probablement créer un type et un retour de ce type de méthode. De cette façon, il est facile pour les futurs programmeurs qui maintient votre code plus lisible.
Trois options:
Option1:
Option 2:
vous pouvez effectuer une itération comme objet
Option 3:
et vous serez en mesure de le parcourir comme un objet dynamique et accéder à leurs propriétés directement
Vous pouvez retourner la liste des objets dans ce cas.
De la création de votre propre classe et d'interrogation car c'est la meilleure solution, je le sais.Autant que je sache, vous ne pouvez pas utiliser anonyme de type de valeur de retour dans une autre méthode, car il ne sera pas seulement être reconnu.Cependant, ils peuvent être utilisés de la même méthode.
J'ai utilisé pour les retourner comme
IQueryable
ouIEnumerable
, si cela ne fonctionne toujours pas vous permettre de voir ce qui est à l'intérieur de l'anonyme de type variable.Que je tombe sur quelque chose comme ça avant, alors que j'essayais de revoir certaines de code, vous pouvez le vérifier ici : Refactoring et la création de méthodes distinctes
Avec la réflexion.
Exemple:
De sortie:
À l'aide de C# 7.0 nous ne pouvons toujours pas de retour de types anonymes, mais nous avons un soutien de tuple types et ainsi, nous pouvons renvoyer une collection de
tuple
(System.ValueTuple<T1,T2>
dans ce cas).La version la plus courte du code que vous voulez, peut ressembler à ceci:
Ou à l'aide de la fluidité de la syntaxe Linq:
À l'aide de C# 7.1 nous pouvons omettre les noms de propriétés de n-uplet et ils sera déduit à partir de n-uplet d'initialisation comme il fonctionne avec les types anonymes:
Vous pouvez uniquement utiliser la dynamique de mots clés,
Mais avec une dynamique de type mot-clé, vous perdez du temps de compilation de sécurité, IDE IntelliSense etc...
Une autre option pourrait être à l'aide de automapper: Vous serez la conversion de n'importe quel type de votre anonyme objet retourné en tant propriétés publiques matchs.
Les points clés sont, de retour de l'objet, l'utilisation de linq et autommaper.
(ou utilisez la même idée de retourner sérialisé, json, etc. ou utiliser la réflexion..)
Maintenant avec les fonctions locales en particulier, mais vous pouvez toujours le faire par le passage d'un délégué qui rend le type anonyme.
Donc, si votre objectif était de lancer une logique différente sur les mêmes sources, et être en mesure de combiner les résultats dans une liste unique. Pas sûr de ce que cette nuance est manquant pour répondre à l'objectif poursuivi, mais aussi longtemps que vous le retour d'un
T
et passer un délégué à rendreT
, vous pouvez nous retourner un type anonyme à partir d'une fonction.Il est effectivement possible de retourner un type anonyme à partir d'une méthode dans un cas d'utilisation. Jetons un coup d'oeil!
Avec C# 7 il est possible de retourner les types anonymes à partir d'une méthode, même si elle vient avec une légère contrainte. Nous allons utiliser une nouvelle fonctionnalité appelée la fonction locale avec une indirection truc (une autre couche d'indirection peut résoudre n'importe quel défi en termes de programmation, non?).
Voici un cas d'utilisation que j'ai récemment identifiés. Je veux ouvrir une session toutes les valeurs de configuration après que je l'ai chargé de
AppSettings
. Pourquoi? Parce qu'il y a une certaine logique autour de valeurs manquantes que rétablir les valeurs par défaut, certains d'analyse et ainsi de suite. Un moyen facile de connecter les valeurs après l'application de la logique est de les mettre tous dans une classe et sérialiser un fichier (à l'aide de log4net). Je tiens également à encapsuler la logique complexe de traiter avec des paramètres et de les séparer que de ce que je dois faire avec eux. Le tout sans la création d'un nom de classe qui existe seulement pour une seule utilisation!Nous allons voir comment résoudre ce problème à l'aide d'une fonction locale qui crée un type anonyme.
J'ai réussi à construire une classe anonyme et également encapsulé la logique de traiter avec des complexes de gestion des paramètres, tous à l'intérieur de
CreateHttpClient
et à l'intérieur de son propre "expression". Cela pourrait ne pas être exactement ce que l'OP voulu mais c'est une approche légère avec un type anonyme qui est actuellement possible dans moderne C#.