Возможно ли в C# использовать строку, как имя переменной?
я получил:
Строка как имя переменной
String x = "matrix1_2";
Microsoft.VisualBasic.PowerPacks.RectangleShape y = ???;
??? - должно быть название переменной ... matrix1_2
Возможно ли в C# использовать строку, как имя переменной?
я получил:
Строка как имя переменной
String x = "matrix1_2";
Microsoft.VisualBasic.PowerPacks.RectangleShape y = ???;
??? - должно быть название переменной ... matrix1_2
Нет, вы не можете, и нет никакого смысла честно иметь такую особенность.
Если вам нужно динамически назначать некоторые данные с ключом и значением, вы можете использовать словарь:
Dictionary<string, RectangleShape> shapes = new Dictionary<string, RectangleShape>();
shapes.Add("matrix1_2", new RectangleShape(...));
Тогда вы можете просто прочитать «переменная», как
shapes["matrix1_2"]
Получил это ... Я люблю тебя! .. Мне нужно это! ... Большое спасибо! –
Нет проблем ...: =) –
@hradecek Если вы чувствуете, что на ваш вопрос был дан ответ, вы можете «принять» его, нажав на контрольный знак слева от ответа. – ispiro
Это невозможно.
У вас нет динамических имен переменных на C#, VB.NET или любом языке .NET. Такой поддержки нет.
Roslyn поддерживает переменный доступ, подобный этому, но, кроме этого, это правильно. – McKay
@McKay - Рослин - совсем другое дело. Это ** не ** C#. – Oded
@Однако, это, конечно, не лучший способ это сделать, я не думаю, но если он знает, какая сборка содержит переменная, он должен иметь возможность использовать отражение, верно? –
Нет это не. Если «matrix1_2» является локальной переменной, то вы не можете сделать это в качестве переменной не может даже существовать после того, как компилятор через, если это на самом деле поле экземпляра, то отражение может помочь:
object value = obj.GetType().GetField(fieldName).GetValue(obj);
Кажется, плохая идея. Попробуйте с перечислениями или собственными типами данных/классами
Вы можете с отражением, но я подозреваю, что в этом случае лучший дизайн, который вы могли бы реализовать, был бы лучше, чем использование отражения. Если вы предоставите немного больше информации, возможно, один из нас может помочь вам в этом.
Объявите словарь переменный:
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"];
Возможно, существует способ сделать то, что вы хотите, используя объект Dictionary <> для хранения ключей и значений. –
Отражение не допускает доступа к переменным в методе: только методы, поля, типы и свойства. – StriplingWarrior
@ StriplingWarrior Это, безусловно, усложняет этот вопрос, хотя это, вероятно, может быть сработано ... определенно не стоит работать, хотя я уверен, что для его проблемы есть лучшие варианты. –
Имеется ли "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
жизней.
Что делать, если matrix1_2 не находится в классе, это всего лишь переменная в методе? – McKay
@McKay - Я не верю, что имена переменных сохраняются внутри метода. Как только вы скомпилируете байт-код CIL, на них ссылаются по позиции (например, V_0, V_1, V_2 и т. Д.), И любое имя, которое вы им дали, теряется. Таким образом, даже если бы вы могли динамически создавать новую локальную переменную, для обращения к ней в ваших программах на C# понадобилось бы немного глубокой магии. Возможно, вы сможете использовать [AOP] (http://en.wikipedia.org/wiki/Aspect-oriented_programming) (возможно, с [PostSharp] (http://www.sharpcrafters.com/) – Justin
Это точно моя точка Он хочет получить доступ к теоретически произвольной переменной. Если это поле, этот код будет работать, если это свойство, другой код будет работать, если это параметр, другой код может работать. У вас нет очень обобщенного решения. – McKay
Вы можете получить значение поля от динамического типа таким способом (с помощью 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» является строкой для имени свойства, которого вы ищете.
Думаю, вы путаете имя и значение переменной. Или я в замешательстве. – kenny
Это возможно * используя отражение, но это не очень хорошая идея, как правило. Чего вы хотите достичь? Вероятно, есть лучший способ. – Blorgbeard
Возможный обман http://stackoverflow.com/questions/4629/c-sharp-eval-equivalent – MikeM