J'ai une requête qui renvoie un type anonyme et la requête est dans une méthode. Comment écrivez-vous ceci:
public "TheAnonymousType" TheMethod(SomeParameter)
{
using (MyDC TheDC = new MyDC())
{
var TheQueryFromDB = (....
select new { SomeVariable = ....,
AnotherVariable = ....}
).ToList();
return "TheAnonymousType";
}
}
c#
.net
anonymous-types
return-type
frenchie
la source
la source
Réponses:
Vous ne pouvez pas.
Vous ne pouvez retourner
object
ou conteneur d'objets, par exempleIEnumerable<object>
,IList<object>
etc.la source
dynamic
. Cela rend le travail un peu plus facile.Vous pouvez retourner
dynamic
ce qui vous donnera une version vérifiée à l'exécution du type anonyme, mais uniquement dans .NET 4+la source
En C # 7, nous pouvons utiliser des tuples pour accomplir ceci:
Vous devrez peut-être installer le
System.ValueTuple
package nuget.la source
Vous ne pouvez pas renvoyer de types anonymes. Pouvez-vous créer un modèle qui peut être retourné? Sinon, vous devez utiliser un fichier
object
.Voici un article écrit par Jon Skeet sur le sujet
Code de l'article:
Ou, voici un autre article similaire
Ou, comme d'autres le commentent, vous pouvez utiliser
dynamic
la source
Vous pouvez utiliser la classe Tuple comme substitut à un type anonyme lorsque le retour est nécessaire:
Remarque: Tuple peut avoir jusqu'à 8 paramètres.
Ou, pour l'exemple de l'article original:
http://msdn.microsoft.com/en-us/library/system.tuple(v=vs.110).aspx
la source
Le compilateur C # est un compilateur en deux phases. Dans la première phase, il ne vérifie que les espaces de noms, les hiérarchies de classes, les signatures de méthode, etc. Les corps de méthode ne sont compilés que pendant la deuxième phase.
Les types anonymes ne sont pas déterminés tant que le corps de la méthode n'est pas compilé.
Le compilateur n'a donc aucun moyen de déterminer le type de retour de la méthode lors 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 utilisez .net 4.0 ou râpe, vous pouvez utiliser
Dynamic
.Si j'étais vous, je créerais probablement un type et je renverrais ce type à partir de la méthode. De cette façon, c'est facile pour les futurs programmeurs qui maintiennent votre code et plus lisible.
la source
Trois options:
Option 1:
Option 2:
vous pouvez l'itérer en tant qu'objet
Option 3:
et vous pourrez l'itérer en tant qu'objet dynamique et accéder directement à leurs propriétés
la source
Vous pouvez renvoyer la liste des objets dans ce cas.
la source
En utilisant C # 7.0, nous ne pouvons toujours pas retourner de types anonymes, mais nous avons un support des types de tuple et nous pouvons donc retourner une collection de
tuple
(System.ValueTuple<T1,T2>
dans ce cas). Actuellement,Tuple types
ne sont pas pris en charge dans les arborescences d'expressions et vous devez charger des données en mémoire.La version la plus courte du code que vous souhaitez peut ressembler à ceci:
Ou en utilisant la syntaxe Linq fluide:
En utilisant C # 7.1, nous pouvons omettre les noms de propriétés de tuple et ils seront déduits de l'initialisation de tuple comme cela fonctionne avec des types anonymes:
la source
Créer votre propre classe et l'interroger est la meilleure solution que je connaisse.Pour autant que je sache, vous ne pouvez pas utiliser de valeurs de retour de type anonyme dans une autre méthode, car elles ne seront pas simplement reconnues.Cependant, elles peuvent être utilisées dans le même méthode. J'avais l'habitude de les renvoyer comme
IQueryable
ouIEnumerable
, bien que cela ne vous laisse toujours pas voir ce qu'il y a à l'intérieur de la variable de type anonyme.J'ai rencontré quelque chose comme ça avant alors que j'essayais de refactoriser du code, vous pouvez le vérifier ici: Refactoring et création de méthodes séparées
la source
Avec réflexion.
Échantillon:
Production:
la source
Vous ne pouvez utiliser que des mots clés dynamiques,
Mais avec un mot-clé de type dynamique, vous perdrez la sécurité du temps de compilation, IDE IntelliSense, etc.
la source
Une autre option pourrait être d'utiliser automapper: vous serez converti en n'importe quel type à partir de votre objet retourné anonyme tant que les propriétés publiques correspondent. Les points clés sont, renvoyer l'objet, utiliser linq et autommaper. (ou utilisez une idée similaire renvoyant json sérialisé, etc. ou utilisez la réflexion ..)
la source
Maintenant avec les fonctions locales en particulier, mais vous pouvez toujours le faire en passant un délégué qui rend le type anonyme.
Donc, si votre objectif était d'exécuter une logique différente sur les mêmes sources et de pouvoir combiner les résultats dans une seule liste. Je ne sais pas quelle nuance il manque pour atteindre l'objectif déclaré, mais tant que vous retournez a
T
et que vous passez un délégué à faireT
, vous pouvez renvoyer un type anonyme à partir d'une fonction.la source
Il est en fait possible de renvoyer un type anonyme à partir d'une méthode dans un cas d'utilisation particulier. Regardons!
Avec C # 7, il est possible de renvoyer des types anonymes à partir d'une méthode, bien que cela s'accompagne d'une légère contrainte. Nous allons utiliser une nouvelle fonctionnalité de langage appelée fonction locale avec une astuce d'indirection (une autre couche d'indirection peut résoudre n'importe quel défi de programmation, non?).
Voici un cas d'utilisation que j'ai récemment identifié. Je veux enregistrer toutes les valeurs de configuration après les avoir chargées depuis
AppSettings
. Pourquoi? Parce qu'il y a une certaine logique autour des valeurs manquantes qui reviennent aux valeurs par défaut, une certaine analyse et ainsi de suite. Un moyen simple de consigner les valeurs après l'application de la logique consiste à les placer toutes dans une classe et à la sérialiser dans un fichier journal (à l'aide de log4net). Je veux également résumer la logique complexe du traitement des paramètres et la séparer de tout ce que j'ai besoin d'en faire. Le tout sans créer une classe nommée qui n'existe que pour une seule utilisation!Voyons comment résoudre ce problème en utilisant une fonction locale qui crée un type anonyme.
J'ai réussi à construire une classe anonyme et également à encapsuler la logique de gestion de paramètres complexes, le tout à l'intérieur
CreateHttpClient
et à l'intérieur de sa propre «expression». Ce n'est peut-être pas exactement ce que l'OP souhaitait, mais c'est une approche légère avec des types anonymes qui est actuellement possible dans le C # moderne.la source