2012-02-07 2 views
4

Возможно ли в C# использовать строку, как имя переменной?
я получил:
Строка как имя переменной

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


??? - должно быть название переменной ... matrix1_2

+1

Думаю, вы путаете имя и значение переменной. Или я в замешательстве. – kenny

+3

Это возможно * используя отражение, но это не очень хорошая идея, как правило. Чего вы хотите достичь? Вероятно, есть лучший способ. – Blorgbeard

+0

Возможный обман http://stackoverflow.com/questions/4629/c-sharp-eval-equivalent – MikeM

ответ

7

Нет, вы не можете, и нет никакого смысла честно иметь такую ​​особенность.

Если вам нужно динамически назначать некоторые данные с ключом и значением, вы можете использовать словарь:

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

Тогда вы можете просто прочитать «переменная», как

shapes["matrix1_2"] 
+1

Получил это ... Я люблю тебя! .. Мне нужно это! ... Большое спасибо! –

+0

Нет проблем ...: =) –

+0

@hradecek Если вы чувствуете, что на ваш вопрос был дан ответ, вы можете «принять» его, нажав на контрольный знак слева от ответа. – ispiro

1

Это невозможно.

У вас нет динамических имен переменных на C#, VB.NET или любом языке .NET. Такой поддержки нет.

+1

Roslyn поддерживает переменный доступ, подобный этому, но, кроме этого, это правильно. – McKay

+0

@McKay - Рослин - совсем другое дело. Это ** не ** C#. – Oded

+0

@Однако, это, конечно, не лучший способ это сделать, я не думаю, но если он знает, какая сборка содержит переменная, он должен иметь возможность использовать отражение, верно? –

2

Нет это не. Если «matrix1_2» является локальной переменной, то вы не можете сделать это в качестве переменной не может даже существовать после того, как компилятор через, если это на самом деле поле экземпляра, то отражение может помочь:

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

Кажется, плохая идея. Попробуйте с перечислениями или собственными типами данных/классами

0

Вы можете с отражением, но я подозреваю, что в этом случае лучший дизайн, который вы могли бы реализовать, был бы лучше, чем использование отражения. Если вы предоставите немного больше информации, возможно, один из нас может помочь вам в этом.

Объявите словарь переменный:

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

Тогда, где бы вы normallay записи "matrix1_2 = SomeValue;", вместо того, чтобы написать:

rectangleDictionary.add("matrix1_2", somevalue) 

Тогда вы будете иметь возможность работать с имя переменной:

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

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

Возможно, существует способ сделать то, что вы хотите, используя объект Dictionary <> для хранения ключей и значений. –

+0

Отражение не допускает доступа к переменным в методе: только методы, поля, типы и свойства. – StriplingWarrior

+0

@ StriplingWarrior Это, безусловно, усложняет этот вопрос, хотя это, вероятно, может быть сработано ... определенно не стоит работать, хотя я уверен, что для его проблемы есть лучшие варианты. –

0

Имеется ли "matrix1_2"? Другими словами, когда вы говорите y = ??? вы пытаетесь получить доступ к существующей переменной или создать ее.

Насколько я знаю, нет способа создать новый экземпляр «named» во время выполнения. Однако вы можете получить имена существующих полей и выбрать их с помощью 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 выше название любых классов matrix1_2 жизней.

+0

Что делать, если matrix1_2 не находится в классе, это всего лишь переменная в методе? – McKay

+0

@McKay - Я не верю, что имена переменных сохраняются внутри метода. Как только вы скомпилируете байт-код CIL, на них ссылаются по позиции (например, V_0, V_1, V_2 и т. Д.), И любое имя, которое вы им дали, теряется. Таким образом, даже если бы вы могли динамически создавать новую локальную переменную, для обращения к ней в ваших программах на C# понадобилось бы немного глубокой магии. Возможно, вы сможете использовать [AOP] (http://en.wikipedia.org/wiki/Aspect-oriented_programming) (возможно, с [PostSharp] (http://www.sharpcrafters.com/) – Justin

+0

Это точно моя точка Он хочет получить доступ к теоретически произвольной переменной. Если это поле, этот код будет работать, если это свойство, другой код будет работать, если это параметр, другой код может работать. У вас нет очень обобщенного решения. – McKay

0

Вы можете получить значение поля от динамического типа таким способом (с помощью C# в проекте 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 
} 

* Где «элемент» представляет собой динамический тип генерируется во время выполнения (но не должен быть) и «FIELDNAME» является строкой для имени свойства, которого вы ищете.

Смежные вопросы