我为我们的MVVM应用程序中编写一个弹出窗口服务。C#泛型类型解决
我已经在弹出的控制器
void ShowDialogWithResult<TView, TViewModel, TResult>(Action<TResult, WindowClosedEventArgs> callbackAction)
where TView : FrameworkElement, IPopupContent<TViewModel>
where TViewModel : IResultViewModel<TResult>;
写了这个方法,你可以看到,以显示与视图模型一个弹出窗口,并导致该视图必须实现IPopupContent<TViewModel>
接口,并反过来视图模型必须实现接口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;
}
}
});
正如你所看到的,我强制传递所有三种类型的参数供编译器生成正确的方法。
这代码让我伤心。如何减少调用所需的类型参数数量,并仍然保持类型安全。我无法开发任何有效的解决方案。
你怎么能指望它来推断'TResult'的类型? – 2011-06-07 08:40:31
我有一种感觉,协变可以处理它。 另外,如果我可以说编译器将只有IPopupContent和IResultViewModel的单一实现,那么编译器可以安全地从视图中获取类型。 – v00d00 2011-06-07 08:52:10
编译器无法知道会有永远只能是一个实现的接口方式。即使在你编写的代码中,并且接口被标记为“内部”,它也没有足够的分析能力来排除使用实现相同接口的Reflection.Emit来即时构建新类。 – 2011-06-07 09:07:59