Est-il un moyen de revenir Anonyme de Type de méthode?
Je sais que je ne peut pas écrire une méthode comme:
public var MyMethod()
{
return new{ Property1 = "test", Property2="test"};
}
Je peux faire autrement:
public object MyMethod()
{
return new{ Property1 = "test", Property2="test"}
}
mais je ne veux pas faire la deuxième option parce que, si je le fais, je vais devoir utiliser la réflexion.
Pourquoi je veux le faire:
Aujourd'hui, j'ai une méthode à l'intérieur de ma page aspx qui renvoie une datatable comme résultat et je ne peut pas le changer, j'ai essayé de convertir cette DataTable à une méthode Anonyme avec les propriétés que je veux travailler avec. Je ne voulais pas créer une classe seulement pour le faire et que j'ai besoin pour exécuter la même requête plusieurs fois, j'ai Pensé à créer une méthode qui retourne un type anonyme serait une bonne ideia.
- Que voulez-vous utiliser? Comment en êtes-vous venu à la conclusion que vous voulez faire quelque chose comme ça?
- J'ai une méthode à l'intérieur de ma page aspx qui renvoie une datatable comme résultat, j'ai essayé de convertir cette datatable à une méthode anonyme avec les propriétés que je veux travailler avec. Je ne voulais pas créer une classe seulement pour le faire et que j'ai besoin pour exécuter la même requête plusieurs fois, j'ai pensé à créer une méthode qui retourne une méthode anonyme serait une bonne ideia.
- ça va prendre beaucoup moins d'effort pour créer une classe pour contenir les données. Je viens de réaliser que juste parce que je peux utiliser des types anonymes pour manipuler facilement les données, cela ne signifie pas que je devrais arrêter de créer des classes pour définir ces types quand j'ai besoin de passer d'une couche à l'autre.
- il est parfois commode de revenir plus d'une valeur ou d'une collection de valeurs à partir d'une fonction. La plupart des langages de programmation permettent de tuples pour ad-hoc, à la volée des collections, mais C# 3.5 ne prend pas en charge cette fonctionnalité. La seule C# alternatives sont: la création d'une série de paramètres, l'emballage ad-hoc des objets dans une classe, ou le retour d'un objet[].
- N'oubliez pas que, comme de C# 3.0, vous pouvez déclarer un type avec très peu de frappe. Exemple:
public class NonAnonymousType { public int Foo { get; set; } public string Bar { get; set; } }
(pardonnez la mise en forme) - double possible de Return type anonyme?
Vous devez vous connecter pour publier un commentaire.
De le retourner comme un
System.Object
est le seulement façon de retourner un type anonyme à partir d'une méthode. Malheureusement, il n'existe pas d'autre moyen de le faire puisque les types anonymes ont été conçues spécifiquement afin d'empêcher leur utilisation dans cette voie.Il y a quelques trucs que vous pouvez faire pour en conjonction avec le retour d'un
Object
qui vous permet de vous rapprocher. Si vous êtes intéressé par cette solution de contournement veuillez lire Ne peut pas revenir en anonyme type de méthode? Vraiment?.Avertissement: Même si l'article que j'ai lié montre une solution de contournement qui ne veut pas dire que c'est une bonne idée de le faire. Je vous déconseillons fortement l'utilisation de cette approche lors de la création d'un type ordinaire serait plus sûr et plus facile à comprendre.
Alternativement, vous pouvez utiliser le n-uplet classe .NET 4.0 et supérieur:
http://msdn.microsoft.com/en-us/library/system.tuple(v=vs. 110).aspx
ensuite, vous pouvez accéder aux propriétés de ce type:
La solution la plus simple est de créer une classe, pousser les valeurs dans la propriété, et de revenir ensuite. Si les types anonymes sont à rendre votre vie plus difficile, alors vous ne les utilisez pas correctement.
Comme alternative, à partir de C# 7 on peut utiliser ValueTuple. Un petit exemple de ici:
Et sur la fin de réception:
Ou:
Nonobstant les mises en garde quant à savoir si c'est une bonne idée ou pas... Un
dynamic
semble fonctionner très bien pour une méthode privée.Vous pouvez exécuter cet exemple dans LinqPad. Il sera de sortie:
Non, les types anonymes ne peuvent pas exister en dehors du contexte dans lequel ils sont créés, et comme un résultat ne peut pas être utilisé comme une méthode de type de retour. Vous pouvez retourner l'instance comme un
object
, mais c'est une bien meilleure idée de créer explicitement votre propre type de conteneur à cette fin.Je pense qu'Andrew Hare est à droite, vous avez juste retour "objet". Pour un commentaire éditorial, j'ai envie de traiter avec des objets dans OO code peut être une "odeur de code." Il y a des cas où c'est la bonne chose à faire, mais la plupart du temps, vous feriez mieux de définir une interface à retour, ou en utilisant une sorte de base de type de classe, si vous allez être de retour à d'autres domaines connexes.
Désolé, vous n'êtes pas vraiment censé le faire. Vous pouvez pirater autour d'elle, de réflexion, ou de faire un générique de la méthode d'assistance pour retourner le type pour vous, mais c'est vraiment à l'encontre de la langue. Il suffit de déclarer le type de sorte qu'il est clairement ce qui se passe.
Non, il n'y a pas de support pour l'élargissement de la portée de la classe anonyme en dehors de la méthode. En dehors de la méthode de la classe est vraiment anonyme, et la réflexion est la seule façon d'accéder à ses membres.
Vous pouvez également inverser le flux de contrôle, si possible:
et puis plus tard somwhere d'autre: