Невидимые входные параметры метода

389
26 октября 2017, 06:49

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

Security sec = new Security();
GetData();
---------------
---------------
--------------
public void GetData(Security sec)
{
int count = sec.Count;
}

Верхняя часть и нижняя находятся в разных классах.

Answer 1

Фактически, вопрос заключается не в невидимых параметрах, а в передаче контекста между методами.

Ты можешь создать явный класс-контекст, проинициализировать его new Security() и передавать его во все методы, как обязательный параметр.

Можешь вызывать методы через него, имея доступ к этой "скрытой" переменной.

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

Ну, а можешь сделать ленивую передачу через AsyncLocal. Только стоит учитывать, что отсутствие строгих связей затрудняет восприятие кода, а найти зависимости становится значительно сложнее.

class Security
{
    private static readonly AsyncLocal<Security> _asyncLocal = new AsyncLocal<Security>();
    public static Security Current
    {
        get => _asyncLocal.Value;
        set => _asyncLocal.Value = value;
    }
    public Int32 Count { get; set; }
}
class Program
{
    static void Main(string[] args)
    {
        Security.Current = new Security();
        try
        {
            GetData();
            GetData();
            GetData();
        }
        finally
        {
            Security.Current = null;
        }
    }
    public static void GetData()
    {
        int count = Security.Current.Count;
    }
}
READ ALSO
Использование F# функций из C#

Использование F# функций из C#

В проекте на C# понадобилось использовать F# функцию (FSharpFunc)Но при попытке это сделать получаю ошибку компиляции

428
Столкновение коллайдеров в unity3d?

Столкновение коллайдеров в unity3d?

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

910
Как в selenium кликнуть по кнопке AJAX

Как в selenium кликнуть по кнопке AJAX

Нужно написать тест для отработки кликов по кнопкам на сайте

263