81 votes

Y a-t-il un moyen de retourner Type Anonyme à partir d'une méthode ?

Je sais que je ne peux pas écrire une méthode comme:

public var MyMethod()
{
   return new{ Property1 = "test", Property2="test"};
}

Je peux le faire autrement:

public object MyMethod()
{
   return new{ Property1 = "test", Property2="test"}
}

mais je ne veux pas choisir la deuxième option car, si je le fais, je devrai utiliser la réflexion.


Pourquoi je veux faire cela:

Aujourd'hui, j'ai une méthode à l'intérieur de ma page aspx qui renvoie un DataTable en tant que résultat et je ne peux pas la modifier, j'ai tenté de convertir ce DataTable en une méthode anonyme avec les propriétés avec lesquelles je veux travailler. Je ne voulais pas créer une classe juste pour ça et comme je devrai effectuer la même requête plusieurs fois, j'ai pensé qu'il serait une bonne idée de créer une méthode qui renvoie un type anonyme.

0 votes

Quel usage en auriez-vous ? Comment en êtes-vous arrivé à la conclusion que vous voudriez faire quelque chose comme ça ?

0 votes

@Guffa, j'ai une méthode à l'intérieur de ma page aspx qui renvoie un datatable en tant que résultat. J'essayais de convertir ce datatable en une méthode anonyme avec les propriétés avec lesquelles je veux travailler. Je ne voulais pas créer une classe juste pour faire cela et comme je devrai exécuter la même requête plusieurs fois, j'ai pensé qu'il serait une bonne idée de créer une méthode qui renvoie une méthode anonyme.

1 votes

@Cleiton - il faudra beaucoup moins d'efforts pour créer une classe pour contenir les données. J'ai réalisé 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 lorsque j'ai besoin de les passer d'une couche à une autre.

76voto

Andrew Hare Points 159332

Renvoyer un System.Object est la seule façon de renvoyer un type anonyme à partir d'une méthode. Malheureusement, il n'y a pas d'autre moyen de le faire car les types anonymes ont été conçus spécifiquement pour empêcher leur utilisation de cette manière.

Il existe quelques astuces que vous pouvez utiliser en conjonction avec le renvoi d'un Object qui vous permettent d'atteindre un résultat similaire. Si cela vous intéresse, veuillez lire Impossible de renvoyer un type anonyme à partir d'une méthode ? Vraiment ?.

Avertissement : Même si l'article que j'ai indiqué montre une solution de contournement, cela ne signifie pas que c'est une bonne idée de le faire. Je vous déconseille fortement d'utiliser cette approche lorsque la création d'un type régulier serait plus sûre et plus facile à comprendre.

10 votes

Il convient de noter que ce n'est pas une idée recommandée. Intellisense ne reconnaîtra plus les propriétés fortement typées du type anonyme (Property1 et Property2 de votre exemple). En fait, vous pouvez utiliser la réflexion pour accéder aux propriétés, mais vous risquez autant de vous taper le pouce avec un marteau pour tout le travail que vous y mettez, sans parler du fait que vous venez de rendre quelque chose censé faciliter votre vie, mais qui en fait la rend plus difficile.

0 votes

+1 couldn't have said it better myself. Yes, it can be done, but that doesn't mean its a good idea. +1 Je n'aurais pas pu mieux le dire moi-même. Oui, c'est possible, mais cela ne veut pas dire que c'est une bonne idée.

0 votes

Vous pouvez également renvoyer un "dynamique", ce qui pourrait être considéré comme un System.Object déguisé.

28voto

The Light Points 5726

Alternativement, vous pouvez utiliser la classe Tuple dans .NET 4.0 et supérieur :

http://msdn.microsoft.com/en-us/library/system.tuple(v=vs.110).aspx

Tuple Create()
{
return Tuple.Create("test1", "test2");
} 

ensuite, vous pouvez accéder aux propriétés comme ceci :

var result = Create();
result.Item1;
result.Item2;

12 votes

Drôle. Je suis venu ici à la recherche d'une alternative à l'utilisation de tuples comme types de retour.

20voto

Nana Kofi Points 61
public object MyMethod() 
{
    return new
    {
         Property1 = "test",
        Property2 = "test"
     };
}

static void Main(..)
{
    dynamic o = MyMethod();  
    var p1 = o.Property1;
    var p2 = o.Property2;
}

17voto

Jagd Points 2677

La solution la plus simple est de créer une classe, d'y mettre les valeurs dans la propriété, puis de la renvoyer. Si les types anonymes rendent votre vie plus difficile, c'est que vous ne les utilisez pas correctement.

4voto

Adam Robinson Points 88472

Non, les types anonymes ne peuvent pas exister en dehors du contexte dans lequel ils sont créés, et par conséquent ne peuvent pas être utilisés comme type de retour de méthode. Vous pouvez renvoyer l'instance en tant que object, mais il est beaucoup plus judicieux de créer explicitement votre propre type de conteneur à cette fin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X