【问题标题】:How to use Observable.FromEvent with static events?如何将 Observable.FromEvent 与静态事件一起使用?
【发布时间】:2010-08-02 16:04:30
【问题描述】:

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

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

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

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

但这会给出语法错误“无法将 lambda 表达式转换为类型 'object',因为它不是委托类型”。事件是这样声明的

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");
}

【问题讨论】:

    标签: c# system.reactive


    【解决方案1】:

    我认为问题在于您的活动委托类型。尝试将其更改为:

    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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-22
      • 1970-01-01
      • 1970-01-01
      • 2014-01-28
      • 1970-01-01
      相关资源
      最近更新 更多