字符串作为变量名称
是否有可能在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"]
知道了...我爱你!...需要这个!...非常感谢! – 2012-02-07 20:14:26
没问题...:=) – 2012-02-07 20:19:32
@hradecek如果你觉得你的问题已经回答了,你可以通过点击答案左边的检查符号来“接受”它。 – ispiro 2012-02-07 20:57:52
不,它是不。如果“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 对象来存储关键字和值,从而完成您想要的操作。 – 2012-02-07 20:08:25
反射不允许访问方法中的变量:只有方法,字段,类型和属性。 – StriplingWarrior 2012-02-07 20:08:30
@StriplingWarrior这确实使问题复杂化了,尽管这可能会解决......绝对不值得解决,因为我确信他的问题有更好的选择。 – 2012-02-07 20:19:02
“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 2012-02-07 20:47:57
@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
这正是我的观点他想访问一个理论上的任意变量,如果它是一个字段,那么这个代码就可以工作,如果它是一个属性,其他代码就可以工作,如果它是一个参数,其他代码可以工作,你没有一个非常普遍的解决方案。 – McKay 2012-02-21 14:50:04
可以以这种方式从一个动态类型(使用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
}
*如果“项目”是在运行时产生的动态类型(但不是必须)和“字段名”是你正在寻找的属性名称的字符串。
我认为你很容易混淆变量的名称和值。或者我很困惑。 – kenny 2012-02-07 20:04:18
它可能*使用反射,但这通常不是一个好主意。你想实现什么?可能有更好的方法。 – Blorgbeard 2012-02-07 20:06:02
可能dupe http://stackoverflow.com/questions/4629/c-sharp-eval-equivalent – MikeM 2012-02-07 20:06:44