Скажем, у меня есть переменная doSomethingWhenTrue. Прямо сейчас скажем, что это false. Теперь каждый раз, когда он переключает значения, я хочу, чтобы он выполнял функцию, подобную этой:

private void someResponseToToggledBool()
{
    If(boolInQuestion)
    {
        //do some stuff
        boolInQuestion = false;
    }
}

Кто-нибудь знает, как это сделать? Моя (дерьмовая) идея состоит в том, чтобы сделать таймер и присвоить этой функции значение тика и передать его в другой поток ... Но должен быть более прямой способ, чем этот правильный?

2
J.Doe 26 Ноя 2016 в 00:27

2 ответа

Лучший ответ

Вы можете использовать недвижимость

private bool _boolInQuestion;
public bool BoolInQuestion
{
    get { return _boolInQuestion; }
    set
    {
         _boolInQuestion = value;
         //call method to do something
    }
}

В установщике вы также можете создать событие, которое обрабатывается тем, кому нужно отреагировать на переключение, или даже реализовать INotifyPropertyChanged (https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged (v = vs.110) .aspx)

< Сильный > ИЗМЕНИТЬ

Согласно вашему комментарию, вы хотите, чтобы это свойство было статическим. Вы можете добиться этого, объявив и поле, и свойство как static:

    private static bool _boolInQuestion;
    public static bool BoolInQuestion
    {
        get { return _boolInQuestion; }
        set
        {
            _boolInQuestion = value;
            //call method to do something
        }
    }

Но для этого потребуется, чтобы метод, вызываемый в установщике, также был static. Кроме того, вы можете оставить свойство нестатичным и реализовать Singleton :

public sealed class BoolHolder
{
    private BoolHolder() { }

    private static BoolHolder instance = null;        
    public static BoolHolder Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new BoolHolder();
            }
            return instance;
        }
    }

    private bool _boolInQuestion;
    public bool BoolInQuestion
    {
        get { return _boolInQuestion; }
        set
        {
            _boolInQuestion = value;
            //call method to do something
        }
    }
}

И получить к нему доступ как BoolHolder.Instance.BoolInQuestion

2
KMoussa 25 Ноя 2016 в 21:57

Использовать собственность

private bool _doSomethingWhenTrue;
public bool doSomethingWhenTrue
{
    get
    {
        return _doSomethingWhenTrue;
    }
    set
    {
        _doSomethingWhenTrue = value;
        someResponseToToggledBool();
    }
 }
1
MarkusEgle 25 Ноя 2016 в 21:34