是否可以从事件中取消订阅匿名方法?
如果我订阅了这样的活动:
void MyMethod()
{
Console.WriteLine("I did it!");
}
MyEvent += MyMethod;
我可以像这样取消订阅:
MyEvent -= MyMethod;
但如果我使用匿名方式订阅:
MyEvent += delegate(){Console.WriteLine("I did it!");};
是否可以取消订阅此匿名方法?如果有,怎么做?
是否可以从事件中取消订阅匿名方法?
如果我订阅了这样的活动:
void MyMethod()
{
Console.WriteLine("I did it!");
}
MyEvent += MyMethod;
我可以像这样取消订阅:
MyEvent -= MyMethod;
但如果我使用匿名方式订阅:
MyEvent += delegate(){Console.WriteLine("I did it!");};
是否可以取消订阅此匿名方法?如果有,怎么做?
当前回答
一个简单的解决办法:
只需将eventandle变量作为参数传递给自身。 事件,如果你的情况下,你不能访问原始创建的变量,因为多线程,你可以使用这个:
MyEventHandler foo = null;
foo = (s, ev, mehi) => MyMethod(s, ev, foo);
MyEvent += foo;
void MyMethod(object s, MyEventArgs ev, MyEventHandler myEventHandlerInstance)
{
MyEvent -= myEventHandlerInstance;
Console.WriteLine("I did it!");
}
其他回答
有点蹩脚的方法:
public class SomeClass
{
private readonly IList<Action> _eventList = new List<Action>();
...
public event Action OnDoSomething
{
add {
_eventList.Add(value);
}
remove {
_eventList.Remove(value);
}
}
}
重写事件添加/删除方法。 保留这些事件处理程序的列表。 当需要时,清除它们并重新添加其他的。
这可能行不通,也不是最有效的方法,但应该能把工作完成。
如果你想用这个委托引用一些对象,你可以使用委托。创建elegate(类型,对象目标,MethodInfo MethodInfo) .net考虑委托equals by target和methodInfo
一个简单的解决办法:
只需将eventandle变量作为参数传递给自身。 事件,如果你的情况下,你不能访问原始创建的变量,因为多线程,你可以使用这个:
MyEventHandler foo = null;
foo = (s, ev, mehi) => MyMethod(s, ev, foo);
MyEvent += foo;
void MyMethod(object s, MyEventArgs ev, MyEventHandler myEventHandlerInstance)
{
MyEvent -= myEventHandlerInstance;
Console.WriteLine("I did it!");
}
一种技术是声明一个变量来保存匿名方法,该变量将在匿名方法本身内部可用。这对我来说很有效,因为我想要的行为是在事件处理后取消订阅。
例子:
MyEventHandler foo = null;
foo = delegate(object s, MyEventArgs ev)
{
Console.WriteLine("I did it!");
MyEvent -= foo;
};
MyEvent += foo;
Action myDelegate = delegate(){Console.WriteLine("I did it!");};
MyEvent += myDelegate;
// .... later
MyEvent -= myDelegate;
只要保持对委托的引用。