Программно использовать строку в качестве имени объекта при создании экземпляра объекта - PullRequest
10 голосов
/ 24 ноября 2008

Это надуманный пример, но допустим, я объявил объекты:

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 ]

31 голосов
/ 24 ноября 2008

Вы должны четко представлять себе разницу между объектом и переменной. Сами объекты не имеют имен. Имена переменных определяются во время компиляции. Вы не можете получить доступ к переменным через имя, определенное во время выполнения, кроме как через отражение.

Звучит так, как будто вы действительно просто хотите Dictionary<string, CustomObj>:

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

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

Затем вы можете получить доступ к объектам, используя индексатор для словаря.

Если вы действительно пытаетесь установить значения переменных на основе их имени во время выполнения, вам придется использовать отражение (см. Type.GetField ). Обратите внимание, что это не будет работать для локальных переменных.

4 голосов
/ 24 ноября 2008

Вы не можете.

Вы можете поместить их в словарь:

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 голосов
/ 21 февраля 2011

используйте this.Controls.Find (control_name, true) [0] ... просто не забудьте привести его

2 голосов
/ 19 июня 2009

Вы можете использовать функцию поиска:

    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 ()), это); Надеюсь, это поможет.

0 голосов
/ 09 апреля 2010

@ jotte: Большое спасибо за эту функцию. Я использовал это, и это работает! За исключением того, что вам нужно изменить container.ID на container.Name

Тогда вам просто нужно использовать что-то вроде (этот пример для флажка, но любой тип переменной может работать):

string Test = "cbACn" + i.ToString (); CheckBox cbTest = (CheckBox) FindControl (Test, gbACSCAT); если (cbTest! = ноль) { cbTest.Checked = true; }

0 голосов
/ 24 ноября 2008

Другой вариант, менее гибкий, но более простой, через Activator.CreateInstance - где вы просите создать новый объект - он не будет назначаться динамическим переменным, но нужен ли он? *

0 голосов
/ 24 ноября 2008

Один вариант - полностью динамический маршрут, согласно этой статье , где вы указываете блок кода в строке, а затем компилируете / запускаете его из вашей программы

0 голосов
/ 24 ноября 2008

Это возможно с помощью отражения, если переменные являются переменными-членами класса, но это ужасно медленно для чего-то большего, чем очень специализированные приложения. Я думаю, что если вы подробно опишите, что вы пытаетесь сделать, мы можем лучше предложить свои предложения. В очень редких случаях вам нужно обращаться к переменной, как вы делаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...