2012-02-07 131 views
4

是否有可能在C#中使用类似变量名称的字符串?
我有一个:
字符串作为变量名称

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


??? - 应该有变量的名称... matrix1_2

+1

我认为你很容易混淆变量的名称和值。或者我很困惑。 – kenny 2012-02-07 20:04:18

+3

它可能*使用反射,但这通常不是一个好主意。你想实现什么?可能有更好的方法。 – Blorgbeard 2012-02-07 20:06:02

+0

可能dupe http://stackoverflow.com/questions/4629/c-sharp-eval-equivalent – MikeM 2012-02-07 20:06:44

回答

7

不,你不能,诚实地说没有这样的功能是没有道理的。

如果您需要动态分配与键和值的一些数据,你可以使用一个字典:

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

然后,你可以简单地阅读“变量”像

shapes["matrix1_2"] 
+1

知道了...我爱你!...需要这个!...非常感谢! – 2012-02-07 20:14:26

+0

没问题...:=) – 2012-02-07 20:19:32

+0

@hradecek如果你觉得你的问题已经回答了,你可以通过点击答案左边的检查符号来“接受”它。 – ispiro 2012-02-07 20:57:52

1

这是不可能的。

您不能在C#,VB.NET或任何.NET语言中使用动态变量名称。不支持这种功能。

+1

Roslyn支持这样的变量访问,但除此之外,这是正确的。 – McKay 2012-02-07 20:06:08

+0

@McKay - Roslyn是一个非常不同的问题。它不是** C#。 – Oded 2012-02-07 20:07:15

+0

@已完成,这当然不是最好的方法,我不认为,但如果他知道变量驻留在什么程序集中,他应该能够使用反射,对吗? – 2012-02-07 20:08:04

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 <>对象来存储关键字和值,从而完成您想要的操作。 – 2012-02-07 20:08:25

+0

反射不允许访问方法中的变量:只有方法,字段,类型和属性。 – StriplingWarrior 2012-02-07 20:08:30

+0

@StriplingWarrior这确实使问题复杂化了,尽管这可能会解决......绝对不值得解决,因为我确信他的问题有更好的选择。 – 2012-02-07 20:19:02

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 2012-02-07 20:47:57

+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 2012-02-20 18:34:28

+0

这正是我的观点他想访问一个理论上的任意变量,如果它是一个字段,那么这个代码就可以工作,如果它是一个属性,其他代码就可以工作,如果它是一个参数,其他代码可以工作,你没有一个非常普遍的解决方案。 – McKay 2012-02-21 14:50:04

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 
} 

*如果“项目”是在运行时产生的动态类型(但不是必须)和“字段名”是你正在寻找的属性名称的字符串。