Информация об изменениях

Сообщение Re[2]: Паттерн "или" от 22.04.2023 0:09

Изменено 22.04.2023 0:26 VladD2

Re[2]: Паттерн "или"
Здравствуйте, Ромашка, Вы писали:

Р>Влад, не тупи...

Р>if (foo() is B || foo() is C)
Р>{
Р> A x = foo();
Р> // код использующий x
Р>}

К сожалению, в реальной жизни всё несколько сложнее. Пришлось на шарпе вот такое накатать:
private static ClickInfo? CreateListItemClickInfoOrDefault(DependencyObject targetControl, DependencyObject[] controls)
{
    if (targetControl is not ListBoxItem and not MenuItem)
        return null;

    if (tryGetViewModels(out var viewModel, out var itemViewModel))
    {
...
    }

    return null;

    bool tryGetViewModels([MaybeNullWhen(false)] out object vm, [MaybeNullWhen(false)] out object itemVm)
    {
        if (controls.OfType<ISupportListItemClickInfo>().FirstOrDefault() is FrameworkElement { DataContext: { } vm1 }
            && targetControl is FrameworkElement { DataContext: { } itemViewModel1 })
        {
            vm = vm1;
            itemVm = itemViewModel1;
            return true;
        }

        if (controls.OfType<Selector>().FirstOrDefault() is FrameworkElement { DataContext: { } vm2 }
            && targetControl is FrameworkElement { DataContext: { } itemVm2 })
        {
            vm = vm2;
            itemVm = itemVm2;
            return true;
        }

        itemVm = null;
        vm = null;
        return false;
    }
Re[2]: Паттерн "или"
Здравствуйте, Ромашка, Вы писали:

Р>Влад, не тупи...

Р>if (foo() is B || foo() is C)
Р>{
Р> A x = foo();
Р> // код использующий x
Р>}

К сожалению, в реальной жизни всё несколько сложнее. Пришлось на шарпе вот такое накатать:
private static ClickInfo? CreateListItemClickInfoOrDefault(DependencyObject targetControl, DependencyObject[] controls)
{
    if (targetControl is not ListBoxItem and not MenuItem)
        return null;

    if (tryGetViewModels(out var viewModel, out var itemViewModel))
    {
...
    }

    return null;

    bool tryGetViewModels([MaybeNullWhen(false)] out object vm, [MaybeNullWhen(false)] out object itemVm)
    {
        if (controls.OfType<ISupportListItemClickInfo>().FirstOrDefault() is FrameworkElement { DataContext: { } vm1 }
            && targetControl is FrameworkElement { DataContext: { } itemViewModel1 })
        {
            vm = vm1;
            itemVm = itemViewModel1;
            return true;
        }

        if (controls.OfType<Selector>().FirstOrDefault() is FrameworkElement { DataContext: { } vm2 }
            && targetControl is FrameworkElement { DataContext: { } itemVm2 })
        {
            vm = vm2;
            itemVm = itemVm2;
            return true;
        }

        itemVm = null;
        vm = null;
        return false;
    }