【发布时间】:2013-11-20 17:27:38
【问题描述】:
我需要在我的集合更改时添加和删除事件处理程序:
public void SetStorageProviderFor<T>(Expression<Func<T, object>> expr, IStorageProvider sp) where T : class
{
MemberExpression me = (MemberExpression)expr.Body;
Set<T>().Local.CollectionChanged +=
(sender, args) =>
{
foreach (var item in args.NewItems)
{
// get entity's property on member expression and set its value
}
}
}
- 如何防止添加相同的处理程序?
-
如何删除某些特定的处理程序?我认为我不应该重复所有相同的代码,但要使用“-=”标记...
我还尝试将处理程序设置为Action以将其存储在内存中,并随时从CollectionChanged取消分配:Action<object, NotifyCollectionChangedEventArgs> act = (sender, args) => { }
但是CollectionChanged 不能接受这个动作作为处理程序:(
感谢您提供任何帮助。
更新
抱歉,我应该发布更多真实代码。问题是我的处理程序使用的参数不仅仅是CollectionChanged,还需要SetStorageProviderFor 方法的expr 和sp。在这种情况下,我可以创建命名方法作为 Tim S. 建议,但如果我为它提供额外的参数,那么我将无法直接将其分配给 Set<T>().Local.CollectionChanged,将再次需要匿名 lambda;(
【问题讨论】:
-
你可能想试试这个
CollectionChangedEventHandler<object, NotifyCollectionChangedEventArgs> act = (sender, args) => { };。 -
@KingKing 刚试过
Set<T>().Local.CollectionChanged += (NotifyCollectionChangedEventHandler)act,它说无法投射 -
@KingKing "Delegate CollectionChangedEventHandler 没有类型参数"
-
@jim 那么
Local的类型是什么?