[英]C# generics type resolving
我正在為我們的 mvvm 應用程序編寫一個彈出式 window 服務。
我在彈出窗口 controller 中寫了這個方法
void ShowDialogWithResult<TView, TViewModel, TResult>(Action<TResult, WindowClosedEventArgs> callbackAction)
where TView : FrameworkElement, IPopupContent<TViewModel>
where TViewModel : IResultViewModel<TResult>;
如您所見,顯示帶有視圖 model 的彈出窗口 window 和結果視圖必須實現IPopupContent<TViewModel>
接口,然后視圖 model 必須實現接口IResultViewModel<TResult>
所以我們有一個從 TView->TViewModel->TResult 開始的類型鏈
對此類方法的調用如下所示:
_childWindowController
.ShowDialogWithResult<AddNationalityPopup,AddNationalityPopupModel, AddNationalityResult>(
(result, a) =>
{
if (a.DialogResult.HasValue && a.DialogResult.Value)
{
if (result.NationalityCountryId.HasValue)
{
Background.NationalityCountryId = result.NationalityCountryId.Value;
Background.NationalityDescription = result.NationalityDescription;
}
}
});
如您所見,我被迫將所有三個類型參數傳遞給編譯器以生成正確的方法。
這段代碼讓我很難過。 如何減少調用所需的類型參數數量並仍然獲得類型安全。 我無法開發任何有效的解決方案。
在此調用中無法減少這些泛型類型參數,但您可以使用 inheritance 來專門重載此方法。
例如,如果有很多調用.ShowDialogWithResult<AddNationalityPopup,AddNationalityPopupModel, ...>
,您可以繼承您的 controller 並添加類似.ShowDialogWithResult<TResult>
的重載。
取2:
像這樣的另一種方法是將這些方法的泛型類型參數添加到 controller class 並使用控制反轉,它可以用適當的類型.ShowDialogWithResult(...)
實例化
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.