在运行时将参数传递给通用方法

时间:2014-04-30 15:55:30

标签: c#

我正在尝试将以下代码重构为单个方法

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语句?提前致谢

1 个答案:

答案 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);
}