我正在尝试将以下代码重构为单个方法
if (message.Type == WindowType.DataSourcePickerTest)
{
var vm = SimpleIoc.Default.GetInstance<DataSourcePickerViewModel>();
var win = new PickerWindowTest { DataContext = vm };
var result = win.ShowDialog() ?? false;
if (result)
Messenger.Default.Send(vm);
}
else if (message.Type == WindowType.BaselineSave)
{
var vm = SimpleIoc.Default.GetInstance<BaselineSaveAsViewModel>();
var win = new BaselineSaveAs { DataContext = vm };
var result = win.ShowDialog() ?? false;
if (result)
Messenger.Default.Send(vm);
}
两个分支之间的唯一区别是ViewModel和Window的类型(vm和win)。到目前为止我已经
了private void LaunchWindow(Type viewModelType, Type windowType)
{
var vm = SimpleIoc.Default.GetInstance<viewModelType>();
}
但是我收到了编译错误'无法找到类型或命名空间名称'viewModelType'。有没有办法在不诉诸反射的情况下重构这个if语句?提前致谢
答案 0 :(得分:3)
你可以将内部部分分解出来并一般地调用它,但是它要求窗口类继承一些具有DataContext
属性的基类型(你可能还需要T
的限制,具体取决于DataContext
属性的类型:
if (message.Type == WindowType.DataSourcePickerTest)
{
SubMethod<DataSourcePickerViewModel, PickerWindowTest>();
}
else if (message.Type == WindowType.BaselineSave)
{
SubMethod<BaselineSaveAsViewModel, BaselineSaveAs>();
}
public void SubMethod<T, U>() where U : Window, new()
{
var vm = SimpleIoc.Default.GetInstance<T>();
var win = new U { DataContext = vm };
var result = win.ShowDialog() ?? false;
if (result)
Messenger.Default.Send(vm);
}