Как добавить универсальный обработчик событий во время выполнения в коллекцию универсальных объектов с другим универсальным типом

У меня есть общий класс GeneralClass, который содержит событие с общим обработчиком событий.

GeneralClass<T>
{
    public event DataChangedHandler<T> DataChanged;
}

И я могу написать следующий код:

class MainClass
{
    public void OnDataChanged<T>(T parametrs)
    {
    }

    var MyClass1 = new GenericClass<classA>();
    var MyClass2 = new GenericClass<classB>();

    MyClass1.DataChanged+= OnDataChanged;
    MyClass2.DataChanged+= OnDataChanged;
}

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

class MainClass{
    public void OnDataChanged<T>(T parametrs)
    {
    }

    var MyClass1= new GenericClass<classA>();
    var MyClass2= new GenericClass<classB>();

    List<> genericClasses = new List<>();
    genericClasses.Add(MyClass1);
    genericClasses.Add(MyClass1);
    genericClasses.foreach(t=>t.DataChanged+=OnDataChanged)
}

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


person Alexander Mochalin    schedule 11.10.2016    source источник


Ответы (1)


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

Сказав это - это технически выполнимо, вот так:

var dynamicList = new List<dynamic> { MyClass1, MyClass2 };
foreach (var generalClass in dynamicList)
{
    this.AddEventHandler(generalClass);
}

со следующим вспомогательным методом:

public void AddEventHandler<T>(GeneralClass<T> item)
{
    item.DataChanged += OnDataChanged;
}
person decPL    schedule 11.10.2016
comment
Спасибо за ваш ответ. И я с вами согласен в какой-то степени. С «динамическим» я теряю безопасность типов. Но когда я смотрю на свой код и вижу: - person Alexander Mochalin; 12.10.2016
comment
MyClass1.DataChanged+=OnDataChanged; MyClass2.DataChanged+=OnDataChanged; . ................................................. .. MyClass12.DataChanged+=OnDataChanged; Меня это серьезно раздражает. И я не могу изменить общие классы, потому что у меня нет к ним доступа. Я пытался сделать интерфейс или использовать наследование. Но это не помогло. - person Alexander Mochalin; 12.10.2016