我有一个Listener类,用于侦听特定的HTTP端口。
我将Listener设置为单例(因为在特定端口上始终会有一个侦听器对象在监听)。
为此,我将默认设置为Listener()构造器private。制作Listener实例(在Listener类内部)static并让static Listener构造函数初始化单例Listener对象。也有static Listener getListener()返回单例Listener实例。

我在侦听器回调方法正在处理的此端口上收到SOAP。

现在,我要将上次通知的日期时间推送到我的UI。

所以我以为以某种方式初始化Listener时,我将传递一个委托,对该委托的引用将存储在Listener中,然后每次收到通知时,在侦听器回调中,我将调用该委托并将其传递给当前时间(new DateTime()),它将随时间执行打印消息的必要任务。我还考虑过将委托参数设置为可选,以便如果委托是null,则在通知时将不会被调用。但是,由于我将构造函数设为私有,因此我无法弄清楚如何将委托传递给它。

总结和概括整个问题:如何将参数(作为实例成员存储)传递给singleton类?

我应该将委托传递给getListener()吗?并在其中每次检查委托是否为空,如果不是,设置它吗?
但是,如果我通过调用Listener.getListener()多次访问此单例对象,则每次它将不必要地检查委托为null。事实上,这就是为什么我将初始化Listener移至静态构造函数的原因,以避免在每次调用Listener时检查是否初始化了getListener()

我应该怎么做才能将参数传递给单例类?还是这必然在getListener()中进行检查?

注意:我不知道,但是这个问题可能归结为我们如何将参数传递给静态构造函数,因为我们需要在首次使用类时初始化事物,并且必须使用委托/其他程序构造对其进行初始化(因此我们无法从静态构造函数中的某些配置文件加载初始化参数)。

最佳答案

只需向您的单例课程添加一个正常事件:

public class Listener
{
  //declare a delegate for the event
  public delegate void InformationDelegate(DateTime timestamp);

  //declare the event using the delegate
  public event InformationDelegate Information;

  public void SomeFunction()
  {
    // do something...
    if(Information != null)
    {
      Information(DateTime.Now);
    }
  }

  // singleton handling etc...
}


然后,每个想要获取通知的对象都会在单例实例上注册自己:

class SomeUIClass
{
  void AFunction()
  {
    Listener.Instance.Information += InformationHandling;
  }

  public void InformationHandling(DateTime timestamp)
  {
    // do something with the information
  }
}


感谢@Kami澄清主题!

关于c# - 将参数传递给单例类/静态构造函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20421003/

10-12 05:32