2009-12-09 7 views
0

Possible en double:
print name of the variable in c#Chaud obtenir le nom d'un objet?

Comment puis-je imprimer le nom d'un objet

MyClass c1, c2; 

printName(c1); 
printName(c2); 

void printName(Object o) 
{ 
    Console.WriteLine("name of object : "+ o.???()); 
} 

sortie devrait ressembler à ceci:

name of object : c1 
name of object : c2 

Ceci est spécifique à .Net, mais répondez à d'autres p latform/langue peut être utile.

+1

en double de http://stackoverflow.com/questions/729803/print-name-of-the-variable-in-c –

+0

objets n'a pas de noms. Les variables ont des noms et les variables contiennent _references_ aux objets. De plus, deux variables (éventuellement avec des noms différents) peuvent faire référence au même objet. –

+0

Quelle langue utilisez-vous spécifiquement? J'ai essayé de recréer VB.NET, pas de chance ... – Moshe

Répondre

-1

Ce n'est pas possible.
Le nom de la variable est important uniquement pour le développeur (pas le compilateur ou l'exécution).

Vous pouvez créer un Dictionary<string, object> & en ajoutant ces instances avec le nom de leur variable pour obtenir quelque chose comme ça.

EDIT: Et c'est la raison, il est dit - écrire du code pour les gens à comprendre et accessoirement pour le compilateur.

+1

Comme toujours, s'il vous plaît expliquer quand downvoting, pourquoi? – shahkalpesh

+0

Huh? J'ai donc ce 'Dictionary '. Et j'ai ces variables 's' et' t' déclarées comme suit: 'chaîne s =" Bonjour, monde! "' Et 'chaîne t = s'. Et je suppose que j'ai mis '(" s "," Hello, World! ")' Et '(" t "," Hello, World! ")' Dans ce dictionnaire. Et maintenant je suis dans cette méthode 'printName' qui a été appelée via' printName (s) '. Alors, comment puis-je utiliser ce dictionnaire pour trouver '" s "'? Et comment puis-je savoir que je ne devrais pas trouver «t»? – jason

+0

@Jason: Vous avez raison. Le scénario dans lequel une instance est référencée par 2 variables échouera. J'ai répondu, juste en regardant le code OP fourni. Je me trompe en mettant 'Dictionary ', ce pourrait être 'Dictionary ' par lequel on peut placer l'instance de l'objet comme clé et le nom de la variable comme valeur. La seule condition est que l'objet n'ait pas déjà été ajouté au dictionnaire. – shahkalpesh

1

Le nom n'existe pas en dehors du code source. Pour ce faire, vous devez vous connecter à vous en tant que débogueur ou parcourir les PDB. En bref, ce n'est pas pratique dans tous les cas pour C# et la plupart des autres langues.

0

Ceci est impossible.

Quel est le résultat de cela?

string s = "Hello, world!"; 
string t = s; 
printName(t); 

Comme s et t se réfèrent tous deux à la même instance de string il n'y a pas moyen de distinguer entre les invocations de printName avec s comme paramètre par rapport t comme paramètre.

Et quel devrait être le résultat?

printName("Hello, world!"); 
+0

@Jason: S'il vous plaît voir ma réponse à votre commentaire ci-dessus. J'espère, je parle sens :) – shahkalpesh

0

Je ne pense pas que ce soit théoriquement possible. Pensez à ce scénario:

MyClass a, b; 
a = new MyClass(); 
b = a; 

Console.WriteLine("name of b is " + SomeMagicClass.GetVarName(b)); 
//Should it be "b" or "a"? 

Je suis sûr qu'il ya une meilleure explication concernant le code généré MIDL le long des lignes de nom de variable même pas être présent lors de l'exécution.

EDIT Hélas j'avais tort. Inspiré par le post de Jon Skeet à propos de la gestion des exceptions Null Reference et se rappelant soudainement de la projection, il existe un moyen de le faire.

est ici codez de travail complet:

public static class ObjectExtensions { 
    public static string GetVariableName<T>(this T obj) { 
     System.Reflection.PropertyInfo[] objGetTypeGetProperties = obj.GetType().GetProperties(); 

     if(objGetTypeGetProperties.Length == 1) 
      return objGetTypeGetProperties[0].Name; 
     else 
      throw new ArgumentException("object must contain one property"); 
    } 
} 

class Program { 
    static void Main(string[] args) { 
     string strName = "sdsd"; 
     Console.WriteLine(new {strName}.GetVariableName()); 

     int intName = 2343; 
     Console.WriteLine(new { intName }.GetVariableName()); 
    } 
} 
0

Cela n'a pas de sens pour la raison suivante:

L'objet lui-même est en mémoire et n'a pas de nom. Vous y accédez en utilisant une référence qui a un nom.Ainsi, le nom de référence peut changer à tout moment, vous pouvez avoir 50 références « pointant » vers le même objet sans nom, etc.

Considérez ceci:

MyClass c1, c2; 
c1 = new MyClass(); 
c2 = c1; 
printName(c1); 
printName(c2); 

Comme vous pouvez le voir, à la fois c1 et c2 sont des références au même objet qui n'a aucun moyen de "savoir" qui le désigne ou par quel nom.

-1

Vous devez placer une propriété Name dans votre classe MyClass, par exemple.

class MyClass { 
    public string Name {get;set;} 

    // rest of class goes here 
    // ... 
} 

alors vous pouvez l'utiliser comme suit:

var c1 = new MyClass() { Name = "c1" }; 
var c2 = new MyClass() { Name = "c2" }; 

printName(c1); 
printName(c2); 

void printName(MyClass o) 
{ 
    Console.WriteLine("name of object : "+ o.Name); 
} 
+0

Cela ne fonctionne pas si l'objet passé à 'printName' n'a pas de propriété' Name'. – jason

+0

Si vous lisez correctement printName, vous verrez qu'il prend dans un objet MyClass, qui est garanti pour avoir un nom. – Will

+0

Votre antécédent est correct mais le conséquent est faux. Ici: 'void printName (Object o)'. Notez aussi qu'il dit "[h] ow je peux imprimer le nom de n'importe quel objet [?]". – jason

Questions connexes