2017-09-14 2 views
-2

La première condition est fournie, mais les modifications ne peuvent pas être transférées lorsque je ne peux pas me référer aux paramètres de la deuxième condition. Malheureusement, le mot clé ref ne peut pas être utilisé avec des paramètres. Sinon, comment puis-je fournir ces deux opérations?Méthode de nettoyage dynamique

internal static void Clear(params dynamic[] ctrl) 
    { 
     for (int i = 0; i < ctrl.Length; i++) 
      if (ctrl[i].GetType().GetProperty("Text") != null) 
       ctrl[i].Text = ""; 
      else if (ctrl[i] is string) 
       ctrl[i] = ""; 
    } 

Exemple:

Après un enregistrement, je veux supprimer les valeurs dans les zones de texte avec une seule méthode. Utilisation:

Clear (txtName, txtsurn average, txtPhone, txtAddress); 

La méthode effacera si elle trouve la propriété de texte dans les paramètres. Cette partie fonctionne très bien. Si une variable est utilisée pendant l'utilisation d'un objet, les nouvelles valeurs affectées à la variable resteront dans la méthode car nous n'obtenons pas de référence. Cette section ne peut pas bien faire le travail, alors je cherche une solution. Utilisation: Considérez les paramètres suivants comme des variables de type chaîne.

Clear (Name, Surname, Phone, Address); 

Ce code fonctionnera mais n'attribuera pas de nouvelles valeurs aux variables.

+2

Ce que vous demandez n'est pas très clair. Quel est le but de ce code? Qu'est-ce que vous essayez d'atteindre et à quel problème vous êtes confronté? S'il vous plaît fournir quelques détails concrets. –

+0

Si j'obtiens un objet en tant que paramètre, effacez-le si la propriété Text existe. Si l'objet n'a pas de propriété Text, effacez la chaîne. Exemple: Clear (txtName, txtSurname, txtPhone); – Emre

+0

Veuillez le lire en premier. Quand vous ne comprenez pas, ne votez pas négatif. – Emre

Répondre

0

Votre problème avec des chaînes (ou tout autre type de valeur vraiment) est que chaînes sont immuables et param valeurs sont toujours passés par valeur. Lorsque vous utilisez params, ce que le compilateur fait est de créer un tableau de valeurs à transmettre à la méthode,

Clear (Name, Surname, Phone, Address); 

est converti en:

object[] temp = new object[] {Name, Surname, Phone, Address}; 
Clear(temp); 

et que les références de chaîne sont passés par valeur, la variable Name d'origine n'a aucune connexion à la valeur qui est stockée dans la matrice et transmise à Clear. Autrement dit, lorsque Clear change la valeur de ctrl[0], la chaîne stockée dans Name est inchangée (ou plus précisément, Namefait référence à à la même chaîne en mémoire).

Une l'option est d'avoir plusieurs avec différents numéros surcharges de ref paramètres:

internal static void Clear(ref object obj1) 
{ 
    object temp = null; 
    Clear(ref obj1, ref temp); 
} 
internal static void Clear(ref object obj1, ref object obj2) 
{ 
    object temp = null; 
    Clear(ref obj1, ref obj2, ref temp); 
} 
internal static void Clear(ref object obj1, ref object obj2, ref object obj3) 
{ 
    object temp = null; 
    Clear(ref obj1, ref obj2, ref obj3, ref temp); 
} 

internal static void Clear(ref dynamic obj1, ref dynamic obj2, ref dynamic obj3, ref dynamic obj4) 
    { 
     void Check(ref dynamic obj) 
     { 
      if (obj.GetType().GetProperty("Text") != null) 
       obj.Text = ""; 
      else if (obj is string) 
       obj = ""; 
     } 
     Check(ref obj1); 
     Check(ref obj2); 
     Check(ref obj3); 
     Check(ref obj4); 
    } 

évidemment, cela limite le nombre de paramètres que vous pouvez avoir, mais il n'y a pas ref param équivalent en C#. Cela dit, je ne vois pas quelle est la valeur dans "effacer" une variable de chaîne - si vous voulez vous contenter de juste les types de référence de soutien alors les surcharges sont inutiles.

+0

Nous vous remercions de votre intérêt et de votre réponse. Oui, je sais que les 'ref params' ne sont pas utilisés ensemble. J'essayais de trouver une méthode alternative sans limiter le paramètre de tableau. Malheureusement, nous devons définir une limite à l'avance. Nous avons créé une méthode qui peut faire ce que je veux en changeant la dernière méthode comme suit. Cependant, les paramètres limités. – Emre

+0

J'ai édité votre réponse. Merci pour encore. – Emre