如何避免 Caliburn Micro Event Aggregator HandleAsync 方法名称的警告?

Posted

技术标签:

【中文标题】如何避免 Caliburn Micro Event Aggregator HandleAsync 方法名称的警告?【英文标题】:How to avoid warnings for Caliburn Micro Event Aggregator HandleAsync method names? 【发布时间】:2021-11-28 00:31:00 【问题描述】:

我的问题很简单,如果我使用 Caliburn Micro 的事件聚合器,并实现接口“IHandle”,那么就会创建一个名为“HandleAsync(MyEvent message, CancelleationToken)”的方法。

我的问题是,这些方法通常不是异步的,不需要用“异步”标记,也不需要返回任务,因此实际上不应该在末尾加上“异步”,因为它们不是异步方法,并在 Visual Studio 中引发警告。

这不会给我带来任何技术问题,只是为了遵守 Caliburn Micro 的事件聚合器订阅方法接口而错误地命名方法很烦人。

简单的问题是如何从方法名称的末尾删除 Async,或者以其他方式摆脱这些警告?

谢谢

加里

【问题讨论】:

警告到底是什么样的? Visual Studio 警告 CS1998,基本上是一个样式问题,您不应该在非异步方法的方法名称末尾使用“Async”,而且很多事件聚合器方法都不是,它们是刷新列表或其他内容的简单调用。 【参考方案1】:

不幸的是,当前在 Caliburn Micro 中实现 EventAggregator 是不可能的。

如果您要检查 github repository 中 EventAggregator 的实现,您会注意到它正在搜索具有特定名称的方法。

var interfaces = handler.GetType().GetTypeInfo().ImplementedInterfaces
                    .Where(x => x.GetTypeInfo().IsGenericType && x.GetGenericTypeDefinition() == typeof(IHandle<>));

foreach (var @interface in interfaces)

  var type = @interface.GetTypeInfo().GenericTypeArguments[0];
  var method = @interface.GetRuntimeMethod("HandleAsync", new[]  type, typeof(CancellationToken) );

  if (method != null)
  
    _supportedHandlers[type] = method;
  

另一种方法是实现您自己的IEventAggregator 版本并引入两个接口IHandle&lt;T&gt;IHandleWithTask&lt;T&gt; 来表示同步和异步变体。

【讨论】:

这是我所期望的,也许在这里实现我自己的选项是一种选择。谢谢。【参考方案2】:

你应该可以suppress源代码中的警告。

在错误列表中右键单击它并选择 Suppress->In Source 或 Suppress->In Suppression File,具体取决于您要插入#pragma 指令的位置。

【讨论】:

谢谢,我希望找到一种方法来实际解决问题而不是抑制警告,这实际上只是让我感到困惑的事情之一,而不是实际的技术问题。

以上是关于如何避免 Caliburn Micro Event Aggregator HandleAsync 方法名称的警告?的主要内容,如果未能解决你的问题,请参考以下文章

Caliburn Micro:如何设置绑定 UpdateSourceTrigger?

Caliburn.Micro 子菜单项如何单击在包含视图的视图模型上调用操作?

使用 WPF 和 Caliburn.Micro 在视图中添加多个视图

Caliburn.Micro 将 DateTimeOffset 绑定到 DatePicker

从Caliburn.Micro,WPF,MVVM中的另一个窗口获取信息

Caliburn.Micro框架之Bindings