2012-02-07 7 views
4

est-il possible en C# d'utiliser une chaîne comme un nom de variable?
J'ai un:
Chaîne en tant que nom de variable

String x = "matrix1_2"; 
Microsoft.VisualBasic.PowerPacks.RectangleShape y = ???; 


??? - il devrait y avoir le nom de variable ... matrix1_2

+1

Je pense que vous confondez le nom et la valeur d'une variable. Ou je suis confus. – kenny

+3

C'est * possible * d'utiliser la réflexion, mais ce n'est pas une bonne idée, habituellement. Que veux-tu accomplir? Il y a probablement un meilleur moyen. – Blorgbeard

+0

dupe possible http://stackoverflow.com/questions/4629/c-sharp-eval-equivalent – MikeM

Répondre

7

Non, vous ne pouvez pas, et cela n'a aucun sens honnêtement d'avoir une fonctionnalité comme ça.

Si vous devez attribuer dynamiquement des données avec une clé et de la valeur, vous pouvez utiliser un dictionnaire:

Dictionary<string, RectangleShape> shapes = new Dictionary<string, RectangleShape>(); 
shapes.Add("matrix1_2", new RectangleShape(...)); 

Ensuite, vous pouvez lire simplement la « variable » comme

shapes["matrix1_2"] 
+1

J'ai compris ... Je t'aime! ... T en ai besoin! ... Merci beaucoup! –

+0

Pas de problème ...: =) –

+0

@hradecek Si vous pensez que votre question a été répondue, vous pouvez "l'accepter" en cliquant sur le signe de contrôle à gauche de la réponse. – ispiro

1

Ceci n'est pas possible.

Vous ne pouvez pas avoir de noms de variables dynamiques en langage C#, VB.NET ou n'importe quel langage .NET. Il n'y a pas de support pour une telle fonctionnalité.

+1

Roslyn supporte l'accès variable comme ceci, mais à part ça, c'est correct. – McKay

+0

@McKay - Roslyn est une question très différente. C'est ** pas ** C#. – Oded

+0

@Oded, ce n'est certainement pas la meilleure façon de le faire Je ne pense pas, mais s'il sait à quel assemblage la variable réside, il devrait être capable d'utiliser la réflexion, non? –

2

Non, c'est ne pas. Si « matrix1_2 » est une variable locale, puis après le compilateur vous ne pouvez pas le faire comme variable pourrait même pas existe est à travers, si elle est en fait un champ d'instance, puis la réflexion peut aider:

object value = obj.GetType().GetField(fieldName).GetValue(obj); 
0

Cela semble être une mauvaise idée. Essayez avec enums ou propres types de données/classes

0

Vous pourriez avec la réflexion, mais je soupçonne dans ce cas, theere est un meilleur design que vous pourriez mettre en œuvre qui serait mieux que d'utiliser la réflexion. Si vous fournissez un peu plus d'informations, probablement l'un de nous pourrait vous aider avec cela.

Déclarez une variable dictionnaire:

Dictionary<string, RectangleShape> rectangleDictionary = new Dictionary<string, RectangleShape>(); 

Alors, où vous normallay écrire "matrix1_2 = somevalue;", au lieu écrire:

rectangleDictionary.add("matrix1_2", somevalue) 

vous serez alors en mesure de travailler avec le nom de variable:

rectangleDictionary["matrix1_2"] = someothervalue; 
rectangleDictionary["matrix1_2"].someproperty = something; 

Microsoft.VisualBasic.PowerPacks.RectangleShape y = rectangleDictionary["matrix1_2"]; 
+0

Il est probablement possible de faire ce que vous voulez en utilisant un objet Dictionary <> pour stocker les clés et les valeurs. –

+0

Reflection n'autorise pas l'accès aux variables d'une méthode: seulement les méthodes, champs, types et propriétés. – StriplingWarrior

+0

@StriplingWarrior Cela complique certainement la chose, même si cela pourrait probablement être corrigé ... cela ne vaut vraiment pas la peine de travailler, car je suis sûr qu'il y a de meilleures options pour son problème. –

0

Est-ce que "matrix1_2" existe déjà? En d'autres termes, quand vous dites y = ??? essayez-vous d'accéder à une variable existante ou en créer une? À ma connaissance, il n'y a aucun moyen de créer une nouvelle instance "nommée" au moment de l'exécution. Cependant, vous pouvez récupérer les noms des champs existants et les sélectionner en utilisant System.Reflection.

String x = "matrix1_2"; 
Microsoft.VisualBasic.PowerPacks.RectangleShape y; 
Type type = typeof(MyType); // Get type pointer 
FieldInfo[] fields = type.GetFields(); 
foreach (var field in fields) 
{ 
     if (field.Name == "matrix1_2") 
     { 
      y = field; 
     } 
} 

MyType ci-dessus est le nom de toute catégorie matrix1_2 vit.

+0

Et si matrix1_2 n'est pas dans une classe, c'est juste une variable dans la méthode? – McKay

+0

@McKay - Je ne crois pas que les noms de variables soient conservés dans une méthode. Une fois que vous compilez au code octet CIL, ils sont référencés par leur position (par exemple V_0, V_1, V_2, etc.) et le nom que vous leur avez donné est perdu. Donc, même si vous étiez capable de créer dynamiquement une nouvelle variable locale, il faudrait de la magie pour s'y référer dans vos programmes C#. Vous pourriez être en mesure d'utiliser [AOP] (http://en.wikipedia.org/wiki/Aspect-oriented_programming) (peut-être avec [PostSharp] (http://www.sharpcrafters.com/) – Justin

+0

C'est précisément mon point de vue Il veut accéder à une variable théoriquement arbitraire: si c'est un champ, ce code fonctionnera, s'il s'agit d'une propriété, un autre code fonctionnera, s'il s'agit d'un paramètre, un autre code pourrait fonctionner, vous n'avez pas de solution très généralisée. – McKay

0

Vous pouvez obtenir une valeur de champ d'un type dynamique de cette manière (en utilisant C# dans un projet Silverlight 5).

Type itemType = item.GetType(); 
try 
{ 
    PropertyInfo field = itemType.GetProperty(fieldName); 
    object val = field.GetValue(item, null); 
} 
catch (Exception ex) 
{ 
    // field doesn't exist, do something else 
} 

* Où « item » est un type dynamique générée lors de l'exécution (mais ne doit pas être) et « fieldName » est une chaîne pour le nom de la propriété que vous recherchez.

Questions connexes