在实例化对象时以编程方式使用字符串作为对象名称

这是一个人为的例子,但我可以说我已声明了对象:

CustomObj fooObj; CustomObj barObj; CustomObj bazObj; 

我有一个字符串数组:

 string[] stringarray = new string[] {"foo","bar","baz"}; 

我如何使用字符串数组以编程方式访问和实例化这些对象,使用类似foreach的方法进行迭代:

 foreach (string i in stringarray) { `i`Obj = new CustomObj(i); } 

希望我想要了解的想法很清楚。 这可能在C#中吗?

提前致谢。

您需要清楚地了解对象和变量之间的区别。 对象本身没有名称。 变量名在编译时决定。 除非通过reflection,否则无法通过执行时确定的名称访问变量。

听起来你真的只想要一个Dictionary

 Dictionary map = new Dictionary(); foreach (string name in stringArray) { map[name] = new CustomObj(name); } 

然后,您可以使用索引器访问对象到字典。

如果您真的想在执行时根据名称设置变量值,则必须使用reflection(请参阅Type.GetField )。 请注意,这不适用于局部变量。

你不能。

您可以将它们放入字典中:

 Dictionary objs = new Dictionary(); foreach (string i in stringarray) { objs[i] = new CustomObj(i); } 

但这和它一样好。

如果将对象存储在类中的字段中,如下所示:

 public class SomeClass { private CustomObj fooObj; private CustomObj barObj; private CustomObj bazObj; } 

然后你可以通过反思到达他们。 如果这是您想要的路线,请告诉我。

你可以使用findfunction:

  public static Control FindControl(string controlId, Control container) { if (container.ID == controlId) return container; foreach (Control control in container.Controls) { Control c = FindControl(controlId, control); if (c != null) return c; } return null; } 

然后你会得到你的控件,基于这样的索引:TextBox firstname =(TextBox)FindControl(string.Concat(“TextBox”,index.ToString()),this); 我希望这有帮助。

使用this.Controls.Find(control_name,true)[0] …只记得要施放它

如果变量是类成员变量,则可以使用reflection,但除了非常专业的应用程序之外,它的速度非常慢。 我想如果你详细说明你想做什么,我们可以更好地提供建议。 很少有人应该像你一样访问变量。

一个选项是完全动态的路由,根据本文 ,您在字符串中指定代码块,然后在程序中编译/运行它

另一种选择,不太灵活,但更简单的是通过Activator.CreateInstance – 你要求创建一个新对象 – 它不会分配给动态变量,但需要吗?

@jotte:非常感谢你的function。 我用它,它的工作原理! 除非您需要通过container.Name更改container.ID

然后你只需要使用类似的东西(这个例子用于复选框,但任何类型的变量都可以工作):

string Test =“cbACn”+ i.ToString(); CheckBox cbTest =(CheckBox)FindControl(Test,gbACSCAT); if(cbTest!= null){cbTest.Checked = true; }