簡體   English   中英

C# generics 類型解析

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM