C#必须在调用事件之前订阅事件

时间:2017-06-16 01:16:44

标签: c#

我想实现一种快速添加侦听器的方法,我的实现:

public class AccountManager 
{

    public delegate void CheckIfLoggedInListener(EventArgs e);
    public event CheckIfLoggedInListener SetCheckIfLoggedInListener;

    public void CheckIfLoggedIn()
    {                
         if(SetCheckIfLoggedInListener!=null)
             SetCheckIfLoggedInListener(new EventArgs("e"));
    }
}

现在,我必须首先设置侦听器,然后调用该方法,如果其他开发人员没有注意,这可能很容易搞砸:

//this will not work, because you invoke the event before subscribing
accountManager.CheckIfLoggedIn();
accountManager.SetCheckIfLoggedInListener += (e) => { Debug.Log(e.param); };

我想知道是否有办法让订单不是强制性的?

1 个答案:

答案 0 :(得分:0)

您可以使用通用委托的参数作为Action<T>类型的对象,在您的情况下,您的方法中的Action<EventArgs>可以确保:{/ p>

编辑:

你需要调整它才能工作,而不是Action<EventArgs>,我们必须使用Action<Object,EventArgs>this post explains why is that

public void CheckIfLoggedIn(Action<object,EventArgs> action)
{
    SetCheckIfLoggedInListener = action.Invoke;

     if(SetCheckIfLoggedInListener!=null)
         SetCheckIfLoggedInListener(null,new EventArgs());
}

在打电话时你需要这样做:

//this will not work, because you invoke the event before subscribing
accountManager.CheckIfLoggedIn((o,e) => { Console.WriteLine("event fired");  });

Working DEMO Fiddle here

通过这种方式,您可以强制用户注册触发事件时要调用的实现。

希望它有所帮助!