如何在运行时将通用事件处理程序添加到具有不同泛型类型的通用对象的集合中

时间:2016-10-11 11:40:27

标签: c# generics collections event-handling

我有一些泛型类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,我必须指定泛型参数(类型)。

1 个答案:

答案 0 :(得分:0)

我会认真地,严肃地要求你重新考虑你的方法 - 收集不同的通用课程,特别是当你不知道哪一个是通往灾难的第一步时。

话虽如此 - 技术上可行,如下:

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