我有一堆ViewModel类,Q001ViewModel,Q002ViewModel,...,QnnnViewModel。这些都继承自VMBase。
我也有一组Subs ShowQnnn,ShowQnnn,...,ShowQnnn。一个例子是:
Private Sub ShowQ001()
Dim workspace As Q001ViewModel = _
CType(Me.Workspaces.FirstOrDefault(Function(vm) vm.GetType() Is GetType(Q001ViewModel)), Q001ViewModel)
If workspace Is Nothing Then
workspace = New Q001ViewModel(_dbc)
Me.Workspaces.Add(workspace)
End If
Me.SetActiveWorkspace(workspace)
End Sub
工作区是VMBase的ObservableCollection。
ShowQnnn过程用于显示ViewModel。关键是,仅当该类型之一不存在时,才会将新的QnnnViewModel添加到工作区集合。
有没有办法将ShowQnnn过程转换为一个通用版本?
最佳答案
抱歉,我对VB.Net的泛型语法了解不多(可以使用VB.Net版本随意编辑我的答案),所以我将用C#进行回答。
如果构造函数采用不同的参数,则解决方案将如下所示:
void ShowQxxx<T>(Func<T> constructor)
where T : VMBase
{
var workspace = (T)(Workspaces.FirstOrDefault(vm => vm is T);
if (workspace == null)
{
workspace = constructor();
Workspaces.Add(workspace)
}
SetActiveWorkspace(workspace)
}
...
ShowQxxx(() => new Q001ViewModel(_dbc));
否则,您可以使用反射进一步简化:
void ShowQxxx<T>()
where T : VMBase
{
var workspace = (T)(Workspaces.FirstOrDefault(vm => vm is T);
if (workspace == null)
{
var ctor = typeof(T).GetConstructor(new [] { typeof(MyDataBaseType) });
workspace = (T)(ctor.Invoke(_dbc));
Workspaces.Add(workspace)
}
SetActiveWorkspace(workspace)
}
...
ShowQxxx<Q001ViewModel>();
关于.net - 我怎样才能使这个通用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7511630/