我试图取消订阅其自身的 lambda。我使用 MethodInfo 类来获取有关 lambda 的信息,并使用 Delegate.CreateDelegate 方法来创建与 lambda 相同的方法。因此,如果在包含我使用的事件的类方法之一中创建的 lambda 但在另一个类方法中不起作用(绑定异常),则它可以正常工作。
这是代码:
public class TestClass
{
public event Action SomeEvent;
public void OnSomeEvent()
{
if (SomeEvent != null)
{
SomeEvent();
}
}
public TestClass()
{
//IT WORKS FINE!!!
//SomeEvent += () =>
//{
// Console.WriteLine("OneShotLambda");
// MethodInfo methodInfo = MethodInfo.GetCurrentMethod() as MethodInfo;
// Action action = (Action)Delegate.CreateDelegate(typeof(Action), this, methodInfo);
// SomeEvent -= action;
//};
}
}
class Program
{
static void Main(string[] args)
{
TestClass t = new TestClass();
t.SomeEvent += () =>
{
Console.WriteLine("OneShotLambda");
MethodInfo methodInfo = MethodInfo.GetCurrentMethod() as MethodInfo;
//GOT AN ERROR
Action action = (Action)Delegate.CreateDelegate(typeof(Action), t, methodInfo);
t.SomeEvent -= action;
};
t.OnSomeEvent();
t.OnSomeEvent(); //MUST BE NO MESSAGE
}
}