2008-11-24 111 views
10

这是一个人为的例子时,但可以说我已经声明的对象:编程方式使用字符串作为对象名称实例化对象

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#中可能吗?

在此先感谢。

+0

,你希望在运行时将对象分配给实例变量,或只是动态创建的对象? – 2008-11-24 12:19:45

回答

31

您需要清楚地了解对象和变量之间的区别。对象本身没有名字。变量名称在编译时决定。除了通过反射之外,您不能通过执行时间确定的名称来访问变量。

这听起来像你真的只想Dictionary<string, CustomObj>

Dictionary<string, CustomObj> map = new Dictionary<string, CustomObj>(); 

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

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

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

+4

我认为这个回应应该可以赢得“直观的客户真正想要的”奖。好的答案 – ScottTx 2010-04-09 19:19:47

+0

如果'CustomObj'没有构造函数呢? – Jnr 2017-02-02 15:51:07

4

你不行。

你可以把它们放入一个字典:

Dictionary<String, CustomObj> objs = new Dictionary<String, CustomObj>(); 

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

但是,这是因为它得到一样好。

如果您在领域对象存储在您的类,像这样:

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

然后你就可以通过反射达到这些目标。让我知道如果这是你想要采取的路线。

0

如果变量是类成员变量,则可以使用反射,但对于非常特殊的应用程序而言,这是非常慢的。我想如果你详细说明你想要做什么,我们可以提供更好的建议。很少有情况下你应该像你在做的那样访问一个变量。

0

一种选择是完全动态路由,按照this article,在那里你在一个字符串指定代码块,然后编译/从程序

0

另一种选择,弹性较差内运行,但更简单的是通过Activator.CreateInstance - 你要求创建一个新的对象 - 它不会分配给动态变量,但这是需要的吗?

2

您可以使用查找功能:

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; 
    } 

,然后你会得到你的控制,基于指数是这样的: 文本框名字=(文本框)的FindControl(string.Concat(“文本框”,指数.ToString()),this); 我希望这可以帮助。

0

@jotte:非常感谢那个功能。我用它,它的工作原理!除了你需要container.Name

改变container.ID

然后你只需要使用类似(本例中是复选框,但是任何类型的变量可以工作):

字符串测试=“cbACn “+ i.ToString(); CheckBox cbTest =(CheckBox)FindControl(Test,gbACSCAT);如果(cbTest!=空) { cbTest.Checked = true; }

2

使用this.Controls.Find(control_name,真)[0] ...只记得也许它转换

相关问题