3 votes

Créer une méthode avec des paramètres ref T parameter

C'est ce que j'ai obtenu dans un projet comprenant des cas de réflexion assez complexes :

static int PopulateValues<T>(List<string> propertyNames, ref T list) { /*...*/ }

// Example call:
PopulateValues(propertyNames, ref list1);

J'aimerais vraiment ajouter params et faire params ref T[] lists pour en autoriser l'utilisation :

PopulateValues(propertyNames, ref list1, ref list2, ...);

Cependant, j'obtiens l'erreur suivante :

Un paramètre ne peut pas avoir à la fois les modificateurs "params" et "ref".

J'ai d'abord pensé à laisser list soit un object[] mais l'utilisation serait laide (casting object ). Pour l'instant, j'appelle la méthode une fois pour chaque type, ce qui évite de multiplier les énumérations.

SOLVED : Je n'ai pas besoin ref pour appeler les méthodes de réflexion sur la classe de paramètres ( SetValue , GetValue , InvokeMember etc.), ce qui signifie que je peux sauter l'étape des ref tout à fait. Vraiment, j'aurais dû essayer.

2voto

CodesInChaos Points 60274

Sur ref + params :

Un membre ne peut pas être une référence. Et puisque params transforme chaque paramètre en membre de tableau, ce qui n'est pas possible.

La seule chose à laquelle je pense est de créer manuellement un certain nombre de surcharges.


Mais dans votre cas, je ne vois pas pourquoi vous avez besoin de ref en premier lieu. Pour ajouter des membres à une liste, il n'est pas nécessaire de modifier la référence elle-même, et donc de lui transmettre mon ref en premier lieu.

1voto

Marc Gravell Points 482669

params est en fait un tableau ; il suffit donc d'en faire un paramètre de type tableau ( T[] , non ref ) et modifiez simplement les valeurs avant de revenir. C'est ce qui se rapproche le plus de ce que vous pouvez faire dans le cas général. Exemple :

Foo[] values =....
SomeMethod(values);
// now look at values[n] etc

0voto

Yuriy Faktorovich Points 33347

Ce n'est pas possible avec la syntaxe de C#. De plus, je n'arrive pas à imaginer comment cela pourrait fonctionner. Vous obtenez votre tableau, mais la définition d'un élément dans ce tableau définirait la valeur de référence ?

0voto

CWKSC Points 135

Voici une solution intéressante :

public delegate RecursionRefFunc<T> RecursionRefFunc<T>(ref T arg);

public static RecursionRefFunc<T> Boo<T>(ref T input)
{
    Console.WriteLine(input); // Work in here
    return Boo;
}

public static void Main(string[] args)
{
    int x1 = 1, x2 = 2, x3 = 3, x4 = 4, x5 = 5;
    Boo(ref x1)(ref x2)(ref x3)(ref x4)(ref x5);
}

// Output: //
// 1
// 2
// 3
// 4
// 5

Le délégué peut déclarer dans la récursivité.

Renvoyer une fonction à l'extérieur et appeler à nouveau.

Et vous serez tué par l'examinateur du code.


Publicité OW< : CWKSC/MyLib_Csharp


Il s'agit d'une copie d'une autre question :

c# - Fonctionnalité intéressante de "params of ref", des solutions ? - Stack Overflow

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