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