c# – 如何避免复制/粘贴许多事件处理程序

我的应用程序无法访问特定的菜单项,除非某些条件为真(DataRepository.IsAllDataLoaded).我想出了这个代码,效果很好.它首先检查条件.如果它没有准备好,它会调用一个计时器,它等待几毫秒并再次调用相同的方法. Timer需要一个ElapsedEventHandler.

public void FirstMenuItem_Click(object sender, RoutedEventArgs e)
{
  if (!DataRepository.IsAllDataLoaded)
  {
    WaitForDataLoading(FirstTimedEvent);        
  }
  else
  {        
    Dispatcher.BeginInvoke(new Action(() =>
   {
     IndividualEntryWindow Window = new IndividualEntryWindow();
     Window.Show();
   }));
  }
}
private void FirstTimedEvent(object source, ElapsedEventArgs e)
{
  FirstMenuItem_Click(null, null);
}

private static void WaitForDataLoading(ElapsedEventHandler timerEvent)
{
  Timer t = new Timer();
  t.Interval = 0.2;
  t.AutoReset = false; 
  t.Elapsed += new ElapsedEventHandler(timerEvent);
  t.Start();
}

最初,FirstMenuItem_Click是唯一的方法.我不得不为我的计时器添加FirstTimedEvent处理程序.有没有办法避免创建ElapsedEventHandler?我可以在FirstMenuItem_Click方法中内联创建吗?

我现在必须对许多其他Item_Click方法使用相同的模式.我希望我不必为每个Item_Click方法创建一个ElapsedEventHandler.

最佳答案 使用匿名lambda表达式:

WaitForDataLoading((s,e) => FirstMenuItem_Click(null, null));
点赞