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

Чтобы получить всю информацию об агенте, а затем присоединиться к нему, чтобы получить счетчики из другой таблицы, вам, как правило, нужно сделать группу по всем неагрегированным полям ... Если в вашей таблице агентов есть несколько полей, вы было бы лучше предварительно агрегировать ваш подзапрос, чтобы просто получать счетчики для каждого агента-агента ... Тогда у вас есть НАИБОЛЕЕ по одной записи на агента и вы можете просто выполнить LEFT-JOIN для этого агента.

Я предполагаю, что ссылки на ваши таблицы "table", "table2", "table3" на самом деле являются поддельными именами реальных таблиц, но в запросе используются псевдонимы "agent", "p" и "q" соответственно.

select 
      agent.*, 
      que.AgentQueueCount queue_count
   from 
      table agent
         left join 
         (select
                q.agent_id,
                count(*) AgentQueueCount
             from 
                table2 q 
                   INNER JOIN table3 p 
                      on q.path_id = p.id 
                      AND p.name='demo'
             where 
                q.status = 1 
             group by
                q.agent_id ) que 
           on agent.id = que.agent_id 
    order by 
       que.AgentQueueCount

Здесь подзапрос уже внутренне объединен по совпадающему идентификатору пути и имени пути.

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

7 ответов

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

Это кажется, что Вы действительно просто хотите 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
поделиться

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

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

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

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

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