0

我试图取消订阅其自身的 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
    }
}
4

1 回答 1

6

它不起作用的原因是您将t作为第二个参数CreateDelegate传入 when you should pass null。这是因为为 lambda 创建的方法将是静态方法。否则不能从静态Main方法中使用。并且文档明确指出您需要传递null静态方法。

话虽如此,你最好以不同的方式做:

TestClass t = new TestClass();
Action eventHandler = null;
eventHandler = () =>
               {
                   Console.WriteLine("OneShotLambda");
                   t.SomeEvent -= eventHandler;
               }
t.SomeEvent += eventHandler;

此代码更具可读性和可理解性,并且性能更好。

于 2012-10-19T09:21:07.937 回答