Используйте один и тот же метод получения и установки для всех свойств в классе - PullRequest
0 голосов
/ 21 апреля 2020

Я создаю класс, который содержит параметры / значения конфигурации для моего приложения. Я хотел бы связать какое-то событие get и set со всеми опциями в моем классе опций. Мой класс выглядит примерно так:

public class Options
{
    public int Option1 { get; set; }
    public bool Option2 { get; set; }
    public string Option3 { get; set; }
    // etc.
}

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

private int _option1;
public int Option1 
{
    get => option1;
    set
    {
        _option1 = value;
        OnOptionChanged("Option1", value);
    }
}

Я знаю, что вышеупомянутое возможно и будет работать, но это не очень удобно. У меня были некоторые мысли о том, чтобы мой Options класс расширил DynamicObject и переопределил TrySetMember, но это вызывается только тогда, когда член не существует в классе. Мне нужно, чтобы мои свойства опций были определены, так как мне нужно добавить XML документацию к каждому из них.

Итак, наконец, есть ли способ реализовать вышесказанное, не добавляя вызов события для каждого из моих свойств сеттеры? В качестве альтернативы, есть ли способ документировать (автоматически, а затем экспортировать в обычный XML файл документации) свойства, которые строго не присутствуют в классе?

1 Ответ

2 голосов
/ 21 апреля 2020

Вы не можете сделать это без инструмента для ткачества IL, такого как PostSharp, однако: вы можете стать ближе; рассмотрим:

private void OnOptionChanged<T>(ref T field, T value,
    [CallerMemberName] string name= null)
{
    field = value;
    OnOptionChanged(name, value);
}
...
public int Option1 {
    get => _option1;
    set => OnOptionChanged(ref option1, value);
}

, что, по крайней мере, немного меньше, чтобы повторить.

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