You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Prism测试ShowDialogAsync:自定义IDialogService类方法未被调用问题

问题根本原因

你遇到的问题本质是C#的成员查找优先级基于变量的声明类型,而非运行时实际类型:

  • 你的ViewModel中注入的dialogService的声明类型是IDialogService接口,而原生IDialogService接口本身并没有定义ShowDialogAsync实例方法,这个方法只是Prism提供的扩展方法
  • 编译期编译器查找IDialogService的成员时找不到匹配的ShowDialogAsync实例方法,就会自动绑定到Prism官方的扩展方法,哪怕你在子类MockDialogService中定义了同名方法,运行时也不会走到你的实现,因为编译期的绑定结果已经确定了。

解决方案

最推荐的无侵入方案:直接MockIDialogService原生定义的ShowDialog方法即可,不需要自己写ShowDialogAsync实现。
Prism官方的ShowDialogAsync扩展方法本质就是对原生ShowDialog方法的包装,内部通过TaskCompletionSource把回调转成Task返回,你只要把Mock类的ShowDialog逻辑写对,扩展方法自然会走你的Mock逻辑:

public class MockDialogService : IDialogService
{
    public void ShowDialog(string name, IDialogParameters parameters, Action<IDialogResult> callback)
    {
        Debug.WriteLine("触发Mock弹窗逻辑");
        IDialogResult res = new DialogResult();
        // 直接调用回调返回结果,官方扩展方法会把这个结果作为Task的返回值
        callback(res);
    }

    // 你之前写的ShowDialogAsync方法可以完全删掉,不需要保留
}

如果你非要强制走自己定义的ShowDialogAsync方法,只能修改ViewModel中dialogService的声明类型为MockDialogService,但这种方式对业务代码侵入性较高,不推荐。

内容的提问来源于stack exchange,提问作者Miamy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 11:54:05