Вызов методов из списка действий - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть этот код:

        public async Task Execute()
        {
            _count = 0;
            _total = 2; //I need to update this every time I add a new code block below.

            //1st code block
            _progressCallback("Downloading Inspections", _count / _total);
            //do stuff
            _count += 1;

            //2nd code block
            _progressCallback("Downloading Profiles", _count / _total);
            //do stuff
            _count += 1;
        }

Мне нужно продолжать добавлять больше блоков кода, а это значит, что мне нужно постоянно обновлять _total.

Я думал о том, чтобы сделать что-то подобное Мне не нужно постоянно обновлять _total, я могу получить его из числа List<Action>:

List<Action> functions = new List<Action>();
functions.Add(() => FirstCodeBlock(_count, functions.Count));

Очевидно, что это не сработает, потому что functions.Count точен только после всех Action s были добавлены.

Есть ли какой-нибудь способ написания этого кода, чтобы я мог добавлять блоки кода без необходимости обновлять _total?

Ответы [ 4 ]

1 голос
/ 07 апреля 2020

Ваш код должен работать нормально. () => FirstCodeBlock(_count, functions.Count) выполняется только когда вы вызываете действие. Попробуйте этот пример кода:

List<Action> functions = new List<Action>();
functions.Add(() => Console.WriteLine(functions.Count));
functions.Add(() => Console.WriteLine(functions.Count));
functions.Add(() => Console.WriteLine(functions.Count));
functions.ForEach(function => function());  

Когда я запускаю это, я получаю это:

3
3
3
1 голос
/ 07 апреля 2020

Просто заполните список заранее.

Если вы храните свои действия в Dictionary<string,Action>, вы также можете хранить там сообщения, что упрощает их повторение в общем виде.

public void DownloadInspections()
{
    //Code goes here
}

public void DownloadProfiles()
{
    //Code goes here
}

public async Task Execute()
{
    var list = new Dictionary<string,Action>
    {
        { "Downloading inspections", DownloadInspections },
        { "Downloading profiles",    DownloadProfiles    }
    };

    foreach (var item in list)
    {
        //Display progress using the string included as the dictionary entry's key
        _progressCallback(item.Key, _count++ / list.Count);

        //Execute the action, which is stored in the dictionary entry's value
        item.Value();  
    }
}
1 голос
/ 07 апреля 2020

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

Это пример закрытие . Поскольку functions объявлено вне лямбда-выражения, компилятор делает некоторые магические изменения c, чтобы позволить его вычислить во время вызова.

0 голосов
/ 07 апреля 2020

Предполагается, что вам не нужно _count в блоке действий, в противном случае удалите _count++ / _total.

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

int _count = 0;
var operations = new List<string>()
{
    "Downloading Inspections",
    "Downloading Profiles"
};

var _total = operations.Count();

_progressCallback(operations[_count], _count++ / _total);

...

_progressCallback(operations[_count], _count++ / _total);

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