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

时间:2008-11-24 12:16:15

标签: c# oop

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

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#中是否可行?

提前致谢。

8 个答案:

答案 0 :(得分:31)

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

听起来你真的只想要一个Dictionary<string, CustomObj>

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

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

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

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

答案 1 :(得分: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;
}

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

答案 2 :(得分: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;
    }

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

答案 3 :(得分:2)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

一个选项是完全动态的路由,按照this article,您可以在字符串中指定代码块,然后在程序中编译/运行它

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

更改container.ID

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

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