繁体   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