在实例化对象时以编程方式使用字符串作为对象名称
这是一个人为的例子,但我可以说我已声明了对象:
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; }