投射通过选举收集的通用列表以订阅事件
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;
...
}
我不知道我是否使用了正确的术语来解决我的问题,所以希望我需要帮助的内容是可以理解的。
目前我有:
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;
...
}