Приведение UserControl в качестве пользовательского элемента управления определенного типа

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

foreach(UserControl uc in plhMediaBuys.Controls)
{
    uc.PulblicPropertyIWantAccessTo;
}

person angelo    schedule 22.10.2008    source источник


Ответы (3)


Кастинг

Я предпочитаю использовать:

foreach(UserControl uc in plhMediaBuys.Controls)
{
    ParticularUCType myControl = uc as ParticularUCType;
    if (myControl != null)
    {
        // do stuff with myControl.PulblicPropertyIWantAccessTo;
    }
}

В основном потому, что использование ключевого слова is вызывает два (почти дорогостоящих) приведения:

if( uc is ParticularUCType ) // one cast to test if it is the type
{
    ParticularUCType myControl = (ParticularUCType)uc; // second cast
    ParticularUCType myControl = uc as ParticularUCType; // same deal this way
    // do stuff with myControl.PulblicPropertyIWantAccessTo;
}

использованная литература

person wprl    schedule 22.10.2008

person    schedule
comment
Я предпочитаю это делать, хотя fallen888 тоже подойдет. - person Marcus King; 22.10.2008
comment
На самом деле этот пример кажется мне менее эффективным, потому что вы создаете еще один экземпляр MyControl. - person Kon; 22.10.2008
comment
Этот код на самом деле не создает новый экземпляр MyControl, он просто создает новую ссылку на него. Ссылки по сути являются указателями, поэтому здесь не должно быть потери производительности. - person Charlie; 22.10.2008
comment
Фактически, если вы используете ключевое слово as или просто приводите переменную, вы делаете то же самое. Единственное различие между ними заключается в том, что если он не может выполнить приведение, он возвращает значение null, а не генерирует исключение. - person Chris Pietschmann; 22.10.2008
comment
Я исправлюсь, но это все еще кажется ненужным - усложняет код. - person Kon; 22.10.2008
comment
мне нужна какая-то директива using или ссылка на сборку в моем коде за ссылками на MyControl? - person angelo; 22.10.2008
comment
Возможно, для кого-то, незнакомого с C #, это сложнее, но зато оно позволяет сэкономить (почти дорого). - person wprl; 22.10.2008
comment
Ой, это обидно, SoloBold. :) Я просто имел в виду, что это увеличивает загруженность кода. - person Kon; 22.10.2008
comment
Я не имел в виду, что вы не сможете понять, что он упал :) - person wprl; 23.10.2008

person    schedule
comment
Фактически, если вы используете ключевое слово as или просто приводите переменную, вы делаете то же самое. Единственное различие между ними заключается в том, что если он не может выполнить приведение, он возвращает значение null, а не генерирует исключение. - person Chris Pietschmann; 22.10.2008
comment
Верно, но он никогда не попадет в эту линию, если не сможет применить. - person Kon; 22.10.2008