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

C# 如何在运行时将泛型事件处理程序添加到具有不同泛型类型的泛型对象集合中,c#,generics,collections,event-handling,C#,Generics,Collections,Event Handling,我有一些泛型类GeneralClass,它包含带有泛型事件处理程序的事件 GeneralClass<T> { public event DataChangedHandler<T> DataChanged; } 通用类 { 公共事件数据变更处理程序数据变更; } 我可以编写下一个代码: class MainClass { public void OnDataChanged<T>(T parametrs) { } va

我有一些泛型类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类main类
{
公共无效数据已更改(T参数)
{
}
var MyClass1=新的GenericClass();
var MyClass2=新的GenericClass();
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)
}
var dynamicList = new List<dynamic> { MyClass1, MyClass2 };
foreach (var generalClass in dynamicList)
{
    this.AddEventHandler(generalClass);
}
class类main类{
公共无效数据已更改(T参数)
{
}
var MyClass1=新的GenericClass();
var MyClass2=新的GenericClass();
List genericClasses=新列表();
genericClasses.Add(MyClass1);
genericClasses.Add(MyClass1);
genericClasses.foreach(t=>t.DataChanged+=OnDataChanged)
}

我知道我可以将所有实例存储在对象列表中,但这样我就无法访问事件。若我将对象强制转换为GenericClass,我必须指定泛型参数(类型)

我会严肃、严肃地要求你重新考虑你的方法——收集不同的泛型类,特别是当你不知道哪一个是通往灾难的第一步时

话虽如此,但在技术上是可行的,比如:

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)
}
var dynamicList = new List<dynamic> { MyClass1, MyClass2 };
foreach (var generalClass in dynamicList)
{
    this.AddEventHandler(generalClass);
}
var dynamicList=新列表{MyClass1,MyClass2};
foreach(dynamicList中的var generalClass)
{
这个。AddEventHandler(通用类);
}
使用以下“助手”方法:

public void AddEventHandler<T>(GeneralClass<T> item)
{
    item.DataChanged += OnDataChanged;
}
public void AddEventHandler(通用类项)
{
item.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)
}
var dynamicList = new List<dynamic> { MyClass1, MyClass2 };
foreach (var generalClass in dynamicList)
{
    this.AddEventHandler(generalClass);
}
var dynamicList=新列表{MyClass1,MyClass2};
foreach(dynamicList中的var generalClass)
{
这个。AddEventHandler(通用类);
}
使用以下“助手”方法:

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

谢谢您的回答。我在某种程度上同意你。使用“动态”时,我会失去类型安全性。但是当我查看我的代码并看到:MyClass1.DataChanged+=OnDataChanged;MyClass2.DataChanged+=OnDataChanged。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。MyClass12.DataChanged+=OnDataChanged;这让我很恼火。我不能更改泛型类,因为我没有访问它们的权限。我试图创建接口或使用继承。但是没用,谢谢你的回答。我在某种程度上同意你。使用“动态”时,我会失去类型安全性。但是当我查看我的代码并看到:MyClass1.DataChanged+=OnDataChanged;MyClass2.DataChanged+=OnDataChanged。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。MyClass12.DataChanged+=OnDataChanged;这让我很恼火。我不能更改泛型类,因为我没有访问它们的权限。我试图创建接口或使用继承。但这没用。