如何将Observable.FromEvent与静态事件一起使用?

时间:2010-07-18 08:21:04

标签: c# system.reactive

我正在尝试使用Reactive Extensions编写代码来处理异步调用,其中启动方法和已完成事件都是静态的。我不能用

var languageSetsLoaded = Observable
  .FromEvent<LoadLanguageSetsCompletedEventArgs>(
    LanguageManager, "LanguageSetsLoaded")

因为LanguageManager是静态类而不是实例,所以我尝试了

var languageSetsLoaded = Observable
  .FromEvent<LoadLanguageSetsCompletedEventArgs>(
    h => LanguageManager.LanguageSetsLoaded += h,
    h => LanguageManager.LanguageSetsLoaded -= h )

但是这会产生语法错误“无法将lambda表达式转换为类型'对象',因为它不是委托类型”。事件因此被宣布

public delegate void LoadLanguageSetsCompletedHandler(LoadLanguageSetsCompletedEventArgs e);
public static event LoadLanguageSetsCompletedHandler LanguageSetsLoaded = delegate { };

所以我认为它是一个委托类型,也许它是静态的这一事实产生了一种误导性的错误描述。

他们是否有某种方法可以做到这一点,或者我只是要坚持这样的非反应性代码?

private void ChangeLanguage(string languageCode)
{
  LanguageManager.LanguageSetsLoaded += OnLanguageSetsLoaded;
  LanguageManager.LoadLanguageSets(languageCode, BaseApp.InTranslationMode);
}

private void OnLanguageSetsLoaded(LoadLanguageSetsCompletedEventArgs e)
{
  LanguageManager.LanguageSetsLoaded -= OnLanguageSetsLoaded;
  OnPropertyChanged("DummyLanguageResource");
}

1 个答案:

答案 0 :(得分:3)

我认为问题是您的事件的委托类型。尝试将其更改为:

public static event EventHandler<LoadLanguageSetsCompletedEventArgs> 
    LanguageSetsLoaded = delegate { };

如果你看一下你试图使用的Observable.FromEvent签名,它看起来像这样:

public static IObservable<IEvent<TEventArgs>> FromEvent<TEventArgs>(
    Action<EventHandler<TEventArgs>> addHandler,
    Action<EventHandler<TEventArgs>> removeHandler
)
where TEventArgs : EventArgs

或者,您可以使用具有三个参数的重载,第一个是转换处理程序 - 但我认为如果可能的话,最好只更改事件签名。