Как удалить функцию после того, как она была выполнена один раз - PullRequest
0 голосов
/ 15 августа 2011

У меня есть функция, которая должна выполняться при событии, отмеченном переключателем, но это нужно сделать только один раз.В последующих событиях, отмеченных переключателем, моя функция не должна вызываться.

void rb_CheckedChanged(x, y)
{
    LoadSomeData(); //need to load only once.
    // rest of the code; to be executed every single time..
}

Примечание:

  1. Я хочу, чтобы LoadSomeData() выполнялся только под переключателемсобытие.

  2. Я могу установить целочисленную переменную-член и выполнить count ++, n, проверить == 1 и т. Д. Или логический флаг.Это не то, что я ищу.

Спасибо ..

Ответы [ 5 ]

1 голос
/ 15 августа 2011

я бы выбрал второй вариант, но вы могли бы использовать делегатов:

public event Action doLoadSomeData; 

void onLoad(sender, args)
{
    doLoadSomeData += LoadSomeData();
}

void rb_CheckedChanged(x, y)
{
    if (doLoadSomeData != null)
    {
         doLoadSomeData(); //need to load only once.
    }
    doLoadSomeData = null;
    // rest of the code; to be executed every single time..
}
1 голос
/ 15 августа 2011

Вы можете создать атрибут с PostSharp [RunOnce]

у этого атрибута может быть свойство, которое указывает, был ли метод уже запущен

PostSharp Link

1 голос
/ 15 августа 2011

Я думаю, что вариант 2 - ваш лучший выбор.

private bool stickyFlag = true;

void rb_CheckedChanged(x,y)
{
    if (true == stickyFlag)
    {
        LoadSomeData();
        stickyFlag = false;
    }
    ....
    // rest of the code; to be executed every single time..
}
1 голос
/ 15 августа 2011

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

List<string> listMethod = new List<string>();
listMethod.Add("LoadSomeData");

затем

void rb_CheckedChanged(x, y)
{
string methodName = listMethod[0];
Type.InvokeMember(
                    methodName,
                    BindingFlags.InvokeMethod | BindingFlags.Public | 
                        BindingFlags.Static,
                    null,
                    null,
                    null);
listMethod.Clear(); //or remove what ever you want
}

Информацию о вызове динамического метода можно получить по адресу: http://www.codeproject.com/KB/cs/CallMethodNameInString.aspx

1 голос
/ 15 августа 2011

Вы можете установить скрытое поле и использовать его в качестве флага, чтобы определить, следует ли вам снова запускать LoadSomeData. Что-то вроде:

void rb_CheckedChanged(x, y)
{
    if (hiddenField.Value == "False")
    {
        LoadSomeData(); //need to load only once.
        hiddenField.Value = true.ToString();
    }
    else
    {
         // Do nothing.
    }
    // rest of the code; to be executed every single time..
}

А на вашей странице:

<asp:HiddenField ID="hiddenField" Value="False" />
...