【发布时间】:2015-01-09 08:32:55
【问题描述】:
我编写了一个事件,该事件应该将一个包含 (T) 类型的通用项目的列表传递给所有订阅者:
public delegate void GenericListItemCountChangedEvent(List<Object> sender, GenericListItemCountChangedEventArgs e);
public event GenericListItemCountChangedEvent GenericListItemCountChanged;
private void RaiseGenericListItemCountChanged<T>(List<T> List) where T : BaseElem {
if (GenericListItemCountChanged != null)
GenericListItemCountChanged(List as List<Object>, new GenericListItemCountChangedEventArgs(typeof(T)));
}
这是一个类的声明,它订阅了上面的事件:
_catalog.GenericListItemCountChanged += (sender, e) => GenericListItemCountChanged(sender, e);
这是在订阅者内部转发事件的方法:
private void GenericListItemCountChanged(List<Object> sender, Catalog.GenericListItemCountChangedEventArgs e) {
Catalog.ListTypes changedListType = Catalog.GetListTypeFromList(changedList);
//GetListTypeFromList expects parameter to be a type of <T> where T : BaseElem
}
显然,List<Object> 无法转换为 List<T> where T : BaseElem。
如果您可以提供一种解决方案,在处理事件的方法中检索列表及其“真实”类型的项目,我会接受您的回答。
(恢复原List状态)
列表中项目的“真实”类型存储在 EventArgs 中。
但我不知道这是否能帮助我......
解决方案:
没有@ChrFin 的帮助,我无法解决这个问题,谢谢伙计!
公共类目录:对象
public delegate void GenericListItemCountChangedEvent(IEnumerable<BaseElem> sender, GenericListItemCountChangedEventArgs e);
public event GenericListItemCountChangedEvent GenericListItemCountChanged;
private void RaiseGenericListItemCountChangedEvent<T>(List<T> List) where T : BaseElem {
if (GenericListItemCountChanged != null) {
GenericListItemCountChanged(List, new GenericListItemCountChangedEventArgs());
}
}
public void ForceRaiseGenericListItemCountChangedEvent<T>(List<T> List) where T : BaseElem {
RaiseGenericListItemCountChangedEvent(List);
}
public class GenericListItemCountChangedEventArgs {
public GenericListItemCountChangedEventArgs() {
}
}
public static ListTypes GetListTypeFromList<T>(IEnumerable<T> List) where T : BaseElem {
Type typeofT = List.GetType().GetGenericArguments()[0];
//typeofT now contains correct subtype of 'BaseElem'
return ListTypes.SomeType //based on 'typeOfT'
}
公共部分类 MainWindow : Window
_catalog.GenericListItemCountChanged += (sender, e) => GenericListItemCountChanged(sender, e);
private void GenericListItemCountChanged(IEnumerable<BaseElem> sender, Catalog.GenericListItemCountChangedEventArgs e) {
Catalog.ListTypes changedListType = Catalog.GetListTypeFromList(sender);
//We now know the changed ListType
}
非常感谢!
【问题讨论】:
标签: c# events generics type-conversion