2014-04-30 43 views
1

我試圖重構下面的代碼到一個單一的方法傳遞參數給泛型方法在運行時

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

兩個分支之間的唯一區別是視圖模型的類型和窗口(VM和WIN) 。到目前爲止,我有

private void LaunchWindow(Type viewModelType, Type windowType) 
{ 
    var vm = SimpleIoc.Default.GetInstance<viewModelType>(); 
} 

但我得到一個編譯錯誤「的類型或名稱空間名'viewModelType'無法找到'。有沒有一種方法來重構這個if語句而不訴諸反思?在此先感謝

+0

在你的LaunchWindow中,不是一個類型,而是一個參數。這是錯誤信息告訴你的。 – Keugyeol

回答

3

您可以將內部元素進行分解並進行一般性調用,但它要求窗口類繼承自某種基本類型(具有DataContext屬性)(您可能還需要對T進行限制,具體取決於DataContext property):

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); 
} 
+1

我想你還需要'new()'約束 –

+0

@SriramSakthivel for'T'或'U'?如果'WindowBase'是一個應該照顧它的類。 –

+0

@reggaeguitar我組成了'WindowBase'。我不知道你是否還有其他基類繼承自它們。 –

相關問題