Назначение методов событиям пользовательских элементов управления, объявленных в интерфейсе

В C# я создаю пользовательские элементы управления для использования в пользовательском приложении. Я хочу, чтобы каждый элемент управления реализовывал событие, которое срабатывает, если внутри элементов управления возникает исключение или ошибка (сбой внутренней проверки). Я создал интерфейс, который объявляет событие. Я создаю пользовательские элементы управления, реализующие интерфейс. Вот моя проблема.

Когда я добавляю один из моих настраиваемых элементов управления в форму, я хочу пройтись по элементам управления в форме, обнаружить все элементы управления, которые являются моими пользовательскими элементами управления, а затем назначить обработчик события событию, которое я объявляю в интерфейсе. Я не могу найти способ привести объект к типу интерфейса.

Рассмотреть возможность:

interface IMyInterface
{
    event ControlExceptionOccured ControlExceptionOccuredEvent;
...
}

public partial class TextControl : UserControl, IMyInterface {
...
  public event ControlExceptionOccured ControlExceptionOccuredEvent;
...
}

и в моей форме я использую один из этих TextControls. У меня есть этот метод:

private void Form1_Load(object sender, EventArgs e)
{
  foreach (Control Control in Controls)
  {
    if (Control.GetType().GetInterface(typeof(IMyInterface).FullName) != null)
    {
       ((IMyInterface)Control).ControlExceptionOccuredEvent += ControlExceptionHandler;
    }
  }
}

Это соответствует, но не будет выполняться. Как я могу добавить ControlExceptionHandler в цепочку событий?

Моя благодарность всем, кто пытается помочь.


person Mike L.    schedule 05.07.2011    source источник
comment
Что вы имеете в виду под не будет выполняться? Есть ли причина не использовать if (Control is IMyInterface) вместо вызова GetType и т. д.?   -  person Jon Skeet    schedule 06.07.2011


Ответы (3)


Насколько я понимаю, вы не можете подписаться на событие, потому что условие IF возвращает FALSE. Вы пытались написать что-то подобное? :

foreach(Control ctrl in this.Controls){
    if((ctrl as IMyInterface) != null) {
        //do stuff
    }
}
person Tigran    schedule 05.07.2011
comment
Это то же самое, что и if (ctrl is IMyInterface) {do stuff}. - person Igby Largeman; 06.07.2011

Это более простой способ сделать это:

if (control is IMyInterface)
    ((IMyInterface)control).ControlExceptionOccuredEvent += ControlExceptionHandler;

... Но способ, которым вы это делаете, тоже должен работать, так что вам придется предоставить более подробную информацию о том, что происходит.

person Igby Largeman    schedule 05.07.2011

Код

((IMyInterface)Control).ControlExceptionOccuredEvent += ControlExceptionHandler;

генерирует

Невозможно привести объект типа "...Text.TextControl" к типу "IMyInterface".

Я не понимаю, почему бы и нет.

В качестве примечания я заменил

if (Control.GetType().GetInterface(typeof(IMyInterface).FullName) != null)

с

if (Control is IMyInterface)

и это не работает. Второй пример никогда не возвращает true. я тоже пробовал

if ((Control as IMyInterface) != null)

и он также никогда не возвращает true.

person Mike Landi    schedule 06.07.2011