我們知道,如果一個類中的方法和擴展方法有相同的簽名,那么應該呼叫類中的方法而不是擴展方法。
所以我的問題是下一個。我試圖IDialogService從Prism.Services.Dialogs. 我的目標是有一個ShowDialogAsync可以測驗的方法的模擬(靜態/擴展方法不能被模擬)。
ShowDialogAsync方法的簽名是:
namespace Prism.Services.Dialogs
...
public static Task<IDialogResult> ShowDialogAsync(this IDialogService dialogService,
string name, IDialogParameters parameters = null);
所以我創建了類MockDialogService:
namespace LoadApp.Core.Helpers
{
public class MockDialogService : IDialogService
{
public void ShowDialog(string name, IDialogParameters parameters, Action<IDialogResult> callback)
{
//throw new NotImplementedException();
}
public Task<IDialogResult> ShowDialogAsync(string name, IDialogParameters parameters = null)
{
Debug.WriteLine("ShowDialogAsync");
IDialogResult res = new DialogResult();
return Task.FromResult(res);
}
}
public class DialogResult : IDialogResult
{
public Exception Exception { get; set; }
public IDialogParameters Parameters { get; set; }
}
}
并在測驗中使用它:
_dialogService = new MockDialogService();
...
var viewModel = new ViewModel(_dialogService);
在除錯會話期間,我dialogService在模型中看到的是我的類的實體MockDialogService。但是ShowDialogAsync我的類中的方法沒有呼叫,它仍然是呼叫的擴展方法。我錯過了什么?先感謝您。
uj5u.com熱心網友回復:
花了一些時間后,我找到了解決方法。
我創建了自己的擴展方法:
public static class MyDialogServiceExtensions
{
public static Task<IDialogResult> ShowDialogAsync(this IDialogService dialogService, string name, IDialogParameters parameters = null)
{
if (dialogService is MockDialogService myService)
{
return myService.ShowDialogAsync(name, parameters);
}
return IDialogServiceExtensions.ShowDialogAsync(dialogService, name, parameters);
}
}
并改變了電話
await dialogService.ShowDialogAsync("MyDialogPage", parameters);
到
await MyDialogServiceExtensions.ShowDialogAsync(dialogService, "MyDialogPage", parameters);
PS我改了題名是為了幫助有同樣問題的人找到這個話題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/372024.html
