Как я могу сделать этот универсальный - PullRequest
1 голос
/ 22 сентября 2011

У меня есть несколько классов 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.

Процедуры ShowQnnn используются для отображения ViewModel. Дело в том, что новый QnnnViewModel будет добавлен в коллекцию рабочих пространств, только если один из этого типа еще не существует.

Есть ли способ превратить процедуры ShowQnnn в одну универсальную версию?

Ответы [ 2 ]

3 голосов
/ 22 сентября 2011

Извините, но я не знаю достаточно синтаксиса 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>();
2 голосов
/ 22 сентября 2011

Вот версия VB

    Private Sub ShowQxxx(Of T As VMBase)(constructor As Func(Of T))
        Dim workspace As T = _
            CType(Me.Workspaces.FirstOrDefault(Function(vm) vm.GetType() Is GetType(T)), T)

        If workspace Is Nothing Then
            workspace = constructor()
            Me.Workspaces.Add(workspace)
        End If

        Me.SetActiveWorkspace(workspace)
    End Sub
....

    ShowQxxx(Function() New Q001ViewModel(_dbc))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...