Позиционная ассоциация аргументов с параметрами

Сейчас, при определении того, какое значение из запроса в какой параметр будет отправлено, мы основываемся на их позиция. Так, если у нас есть условный конструктор с двумя параметрами с типом int и есть две значения в запросе, то первое уйдёт в первые параметр а второе – во второй.

Пока это нас вполне устраивает. Но мы не имеем возможности при вводе значения в консоли (или через любой другой ввод) указать то, что первое число должно уходить во второй параметр, а второй – в первый.

Это можно было бы достичь с помощью меток. Например, для выполнения команды BuyGood, можно было бы записывать такую строку:

BuyGood goodId:1 count:2

Вместо :

BuyGood 1 2

Чтобы сохранить поддержку ввода старого образца, мы могли бы сделать ещё одну сущность, которая преобразовывала бы обычный позиционный ввод в именованные аргументы, которые мы могли бы в дальнейшем более точно ассоциировать с параметрами.

В классе Request появился бы примерно такой метод.

Фрагмент 2.41  

public bool TryGetValue(string name, out int value)
{

}

И мы бы им пользовались в классе Router в методе определения аргументов.

Фрагмент 2.42

private object[] ResolveDependeciesAndMerge(ConstructorInfo constructor, Request request)
{
    List<object> args = new List<object>();

    foreach (var parameter in constructor.GetParameters())
    {
        if (_dependecies.TryGetValue(parameter.ParameterType, out object value))
        {
            args.Add(value);
        }
        else
        {
            if (request.TryGetValue(parameter.Name, out int arg))
            {
                args.Add(arg);
            }
            else
            {
                return null;
            }
        }
    }

    if (args.Count == constructor.GetParameters().Length)
    {
        return args.ToArray();
    }
    else
    {
        return null;
    }
}

Если вы нашли ошибку, пожалуйста выделите её и нажмите Ctrl+Enter.


Leave a Reply

Your email address will not be published. Required fields are marked *