[英]Pass Parameter to Generic Method at Runtime
我正在嘗試將以下代碼重構為單個方法
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語句? 提前致謝
您可以將內部部分分解並一般地調用它,但它要求窗口類繼承一些具有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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.