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

本文关键字:泛型 泛型类型 集合 对象 运行时 事件处理 添加 程序 | 更新日期: 2023-09-27 18:12:25

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

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

我要认真地、认真地要求您重新考虑您的方法——拥有不同的泛型类的集合,特别是当您不知道哪个是哪个的时候,这是走向灾难的第一步。

话虽如此,这在技术上是可行的,像这样:

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

使用以下'helper'方法:

public void AddEventHandler<T>(GeneralClass<T> item)
{
    item.DataChanged += OnDataChanged;
}