【问题标题】:How to add generic event handler at runtime to collection of generic objects with different generic type如何在运行时将泛型事件处理程序添加到具有不同泛型类型的泛型对象的集合中
【发布时间】:2016-10-11 11:40:27
【问题描述】:

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

【问题讨论】:

    标签: c# generics collections event-handling


    【解决方案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;
    }
    

    【讨论】:

    • 感谢您的回答。我在某种程度上同意你的看法。使用“动态”,我失去了类型安全性。但是当我查看我的代码并看到:
    • MyClass1.DataChanged+=OnDataChanged; MyClass2.DataChanged+=OnDataChanged; . ..................................................... .. MyClass12.DataChanged+=OnDataChanged;这让我很恼火。而且我无法更改泛型类,因为我无权访问它们。我试图制作接口或使用继承。但这没有帮助。
    猜你喜欢
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    相关资源
    最近更新 更多