Как вызвать делегатов с возвратами последовательно? [Дубликат]

Я использовал бы self.table_name_prefix, как это было предложено другими, но вы можете определить его немного более точно следующим образом:

self.table_name_prefix "#{Rails.configuration.database_configuration["#{Rails.env}"]['database']}."

, альтернативно вы также можете использовать это:

self.table_name_prefix "#{connection.current_database}."

Вы должны иметь в виду, что последний выполнит запрос SELECT DATABASE() as db при первом загрузке этого класса.

1
задан Shlomo 28 December 2015 в 17:18
поделиться

3 ответа

Как упоминалось в ответе Андрея, если вы просто вызываете qualificationCheckCallback как обычный метод, вы получите только возвращаемое значение из одного из методов. По этой причине довольно много делегатов многоадресной передачи, у которых есть возвращаемое значение.

Если ваша цель - проверить, возвращает ли хотя бы один из методов, хранящихся в вашем делегате, false, вам нужно вызвать методы индивидуально. Вот один из способов сделать это с помощью метода Delegate.GetInvocationList () :

bool hasAtLeastOneFalse = false;
if (qualificationCheckCallback != null)
{
    foreach(var f in qualificationCheckCallback.GetInvocationList()
                                               .Cast<Func<Employee, Shift, bool>>())
    {
        if (!f(employee, shift))
        {
            hasAtLeastOneFalse = true;
            // break; // If you don't care about invoking all delegates, you can choose to break here.
        }
    }
}

Console.WriteLine(hasAtLeastOneFalse);

Я не предполагаю, что это хорошая практика, но это можно сделать.

0
ответ дан sstan 15 August 2018 в 20:35
поделиться

Быстрый поиск в MSDN нашел этот поток:

https://social.msdn.microsoft.com/Forums/en-US/38a638fe-4a7d-44d6-876c-729d90c20737/ how-to-get-return-value-from-delegate? forum = csharplanguage

Проблема с событиями заключается в том, что возвращаемые значения нельзя полностью доверять. Вы получите только одно возвращаемое значение, независимо от того, сколько подписчиков у вас есть на мероприятие. Центральная проблема заключается в том, что вы не можете надежно определить, какой абонент произвел возвращаемое значение. Красота .NET Event Model - анонимность, которую она использует. Это означает, что подписчики событий полностью абстрагируются от издателей событий.

0
ответ дан Andrew Williamson 15 August 2018 в 20:35
поделиться

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

Вы можете сделать эту работу (если нужно), изменив подпись, чтобы включить переменная «состояние», передаваемая по ссылке на каждого вызывающего абонента:

private Action<Employee, Shift, QualCheckState> qualificationCheckCallback;

public class QualCheckState { public bool Passed { get; set; } }

// Call it thus:
var state = new QualCheckState { Passed = true }; // Hope for the best
qualificationCheckCallback(someEmployee, someShift, state);
if (state.Passed) {
    // Assume everyone passed
}

Имейте в виду, для этого требуется, чтобы вызываемые лица соблюдали подпись и не перезаписывали чье-либо несостоявшееся состояние:

public void SomeCallee(Employee e, Shift s, State state) {
   // If some other check failed, don't bother doing our check.
   if (!state.Passed) return;
   // Do some check here
   if (checkFailed) state.Passed = false;
}

Конечно, вы можете также расширить этот шаблон, чтобы сделать его более безопасным:

public class QualCheckState {
    private List<bool> _results = new List<bool>();
    public bool Passed { get { return _results.All(s => s); }
    public void RecordResult(bool result) {
        _results.Add(result);
    }
}
0
ответ дан Chris Shain 15 August 2018 в 20:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: