Программно с помощью строки в качестве имени объекта при инстанцировании объекта

Это - изобретенный пример, но позволяет, говорят, что я объявил объекты:

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#?

10
задан Cœur 16 November 2019 в 12:06
поделиться

6 ответов

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

Это кажется, что Вы действительно просто хотите a Dictionary<string, CustomObj>:

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

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

Можно затем получить доступ к объектам с помощью индексатора для словаря.

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

32
ответ дан 3 December 2019 в 13:51
поделиться

Вы не можете.

Можно разместить их в словарь:

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

Затем можно достигнуть их посредством отражения. Сообщите мне, является ли это маршрутом, Вы хотите взять.

4
ответ дан 3 December 2019 в 13:51
поделиться

Другая опция, менее гибкая, но более простая, через Активатор. CreateInstance - где Вы просите новый объект быть созданными - он не присвоит динамическим переменным, но это необходимо?

0
ответ дан 3 December 2019 в 13:51
поделиться

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

0
ответ дан 3 December 2019 в 13:51
поделиться

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

0
ответ дан 3 December 2019 в 13:51
поделиться

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

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

2
ответ дан 3 December 2019 в 13:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: