.net - 我怎样才能使这个通用

标签 .net vb.net generics mvvm

我有一堆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/

相关文章:

c# - 如何拆分数组列表?

.net - 使 WebBrowser 控件删除其缓存

c# - 我应该使 C# 私有(private)方法通用吗?

c# - 对于 C# 无法使用类型约束推断泛型类型参数,是否有解决方法?

scala - 如何通过scala中的类方法传递类型参数?

c# - 在 C# 中,确定数据库是否已启动并正在运行的最佳方法是什么?

c# - 不允许派生类的具体属性实现接口(interface)的接口(interface)属性背后的原因是什么?

c# - 如何按日、周、月自动发送邮件?

mysql - vb.net 删除非法字符 - 但不删除空格

vb.net - 根据条件计算子字符串中字符串的出现次数