投射通过选举收集的通用列表以订阅事件

Cast generic list gathered by relection for subscribing event

我不知道我是否使用了正确的术语来解决我的问题,所以希望我需要帮助的内容是可以理解的。

目前我有:

public class MyCollection<T, U> : ObservableCollection<T>, IParented<U> {..}

public class MyInitClass()
{
    var bindingFlags = BindingFlags.Instance | BindingFlags.Public |     BindingFlags.NonPublic;
    var fieldValues = obj.GetType().GetFields(bindingFlags).Where(x => x.FieldType.Name.StartsWith("MyCollection"));

    foreach (FieldInfo fieldInfo in fieldValues)
    {
        var list = fieldInfo.GetValue(obj);

        if (list is MyCollection<MyClassA> classA)
            classA.CollectionChanged += Abstract_CollectionChanged;
        else if (list is MyCollection<MyClassB> classB)
            classB.CollectionChanged += CollectionChanged;
        else if (list is MyCollection<MyClassC> classC)
            classC.CollectionChanged += CollectionChanged;
        ...
    }
}

这工作正常,问题是我有几十个 类 和 类 不断添加和删除,因此这个 if else 很烦人,希望有更好的方法.我只想订阅 CollectionChanged 事件,这里的实际值不会打扰我。

dynamic list = fieldInfo.GetValue(obj);
list.CollectionChanged += Abstract_CollectionChanged;

不起作用,因为使用 dynamic 时无法订阅事件。

那么有没有一种方法可以订阅事件而不用执行这个没完没了的 if-else?

提前致谢!

如果你的泛型 MyCollection<T> 实现了非泛型 INotifyCollectionChanged 接口(如果它派生自 ObservableCollection<T> 就是这种情况),那么整个 foreach 可以像这样简化:

foreach (FieldInfo fieldInfo in fieldValues)
{
    var list = fieldInfo.GetValue(obj);

    if (list is INotifyCollectionChanged notifyCollectionChanged)
        notifyCollectionChanged.CollectionChanged += CollectionChanged;
    ...
}