C#泛型类型解析

时间:2011-06-07 08:31:42

标签: c# generics

我正在为我们的mvvm应用程序编写一个弹出窗口服务。

我在弹出控制器中写了这个方法

void ShowDialogWithResult<TView, TViewModel, TResult>(Action<TResult, WindowClosedEventArgs> callbackAction)
            where TView : FrameworkElement, IPopupContent<TViewModel>
            where TViewModel : IResultViewModel<TResult>;

如您所示,为了显示一个包含视图模型和结果的弹出窗口,视图必须实现IPopupContent<TViewModel>接口,而视图模型必须实现接口IResultViewModel<TResult>

所以我们有一系列从TView开始的类型 - &gt; TViewModel-&gt; 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;
                            }
                        }
                    });

正如您所看到的,我被迫为编译器传递所有三个类型参数以生成正确的方法。

这段代码让我感到难过。如何减少调用所需的类型参数数量,仍然可以获得类型安全性。我无法开发出任何有效的解决方案。

1 个答案:

答案 0 :(得分:1)

在此调用中无法减少这些泛型类型参数,但您可以使用继承来专门化它重载此方法。

例如,如果对.ShowDialogWithResult<AddNationalityPopup,AddNationalityPopupModel, ...>进行了大量调用,您可以继承控制器并添加类似.ShowDialogWithResult<TResult>的重载。

拿2:

这样的另一种方法是将这些方法的泛型类型参数添加到控制器类并使用控制反转,它可以使用适当的类型参数进行实例化,从而释放调用者在.ShowDialogWithResult(...)中提供它们。