2015-11-19 3 views
0

Est-il possible de surcharger ToString(), donc une classe renvoie son propre nom d'instance, lorsqu'il est déclaré statique? Je n'ai besoin de cela qu'au moment de la conception, pas pendant l'exécution de la commande.Obtention du nom d'instance statique propre au moment du design

public class MyVar 
{ 
    public override string ToString() 
    { 
     return MY_NAME(); 
    } 
} 

public class Vars 
{ 
    public static MyVar a = new MyVar(); //ToString() returns "a" or "Vars.a" 
    public static MyVar b = new MyVar(); //ToString() returns "b" or "Vars.b" 
    public static MyVar c = new MyVar(); //ToString() returns "c" or "Vars.c" 
    public static MyVar d = new MyVar(); //ToString() returns "d" or "Vars.d" 
} 

Contexte: Je veux montrer ce nom dans PropertyGrid du concepteur:

 this.myButton2.Text = "myButton2"; 
     this.myButton2.UseVisualStyleBackColor = true; 
     this.myButton2.Reference = Vars.b;//Should be displayed in the PropertyGrid as "b" or "Vars.b" 
+0

Bien sûr, j'utilise des énumérations très souvent, mais ils ne m'aident pas ici. Je suis actuellement en train de jouer avec CodeDomSerializer et TypeConverter, pour rendre posible de sélectionner une classe statique dans la grille de propriété au designtime [Voir mon autre question] (http://stackoverflow.com/questions/33759065/selecting-static-fields-via -dropdown-at-designtime-in-c-sharp) – drvolcano

+0

Qu'est-ce que 'myButton2.Reference'? –

+0

@David: La référence est une représentation d'une variable dans un automate S7. Je veux créer un framework HMI pour Visual Studio, et "Reference" est utilisé pour connecter le contrôle IHM à l'étiquette dans l'automate. Il contient toutes les fonctions et les données pour l'écriture et la lecture de cette balise (pour un bouton ce sera BOOL, qui est défini sur preess et réinitialisé à la sortie) – drvolcano

Répondre

1

No.

Les références sont juste que - une référence à une instance. Ils ne sont pas nommés. Le local ou de terrain que vous utilisez pour stocker la référence peut avoir un nom, mais il n'y a aucun moyen d'obtenir de la référence au champ autre que en essayant de comparer chacun à son tour - par exemple:

void Main() 
{ 
    Vars.a.ToString().Dump(); 
    Vars.b.ToString().Dump(); 
    Vars.c.ToString().Dump(); 
    Vars.d.ToString().Dump(); 
} 

public class MyVar 
{ 
    public override string ToString() 
    { 
     var field = typeof(Vars) 
        .GetFields() 
        .Where(i => object.ReferenceEquals(i.GetValue(null), this)) 
        .FirstOrDefault(); 

     return field == null ? "Unknown" : field.Name; 
    } 
} 

public class Vars 
{ 
    public static MyVar a = new MyVar(); //ToString() returns "a" or "Vars.a" 
    public static MyVar b = new MyVar(); //ToString() returns "b" or "Vars.b" 
    public static MyVar c = new MyVar(); //ToString() returns "c" or "Vars.c" 
    public static MyVar d = new MyVar(); //ToString() returns "d" or "Vars.d" 
} 

Cependant, cette est certainement une odeur de code - vous ne devriez pas vraiment besoin de quelque chose comme ça. Selon ce que vous essayez exactement de faire, il y a probablement beaucoup d'approches beaucoup plus propres. Par exemple, vous pouvez utiliser quelque chose comme ceci:

public class MyVar 
{ 
    public static readonly MyVar a = new MyVar(nameof(a)); 
    public static readonly MyVar b = new MyVar(nameof(b)); 
    public static readonly MyVar c = new MyVar(nameof(c)); 
    public static readonly MyVar d = new MyVar(nameof(d)); 

    private readonly string name; 
    private MyVar(string name) { this.name = name; } 

    override string ToString() { return this.name; } 
} 
+0

Merci beaucoup pour votre solution, c'était la dernière une partie du puzzle dont j'avais besoin :) – drvolcano

+0

Et: vous avez tout à fait raison, ce n'est peut-être pas la meilleure façon de faire les choses, mais j'ai mes raisons;) – drvolcano

0

MyVar lui-même ne peut le faire aussi impossible de résoudre des situations tout se poser trop facilement, par exemple, ce serait .ToString() retour pour le code suivant:

public static MyVar a = new MyVar(); 
public static MyVar b = a; // Should ToString() return "a" or "b"? 

Si vous utilisez C# 6, alors nameof pourrait être utilisé pour renvoyer le nom de la variable:

this.myButton2.Reference = nameof(Vars.b); 

si je suis pas clair sur ce que Reference est ici, donc cela peut ne pas fonctionner.