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

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

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 ответов

Решение

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

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

Я думаю, что вариант 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..
}

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

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..
}

Вы можете установить скрытое поле и использовать его в качестве флага, чтобы определить, следует ли запускать 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" />

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

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

PostSharp Link

Другие вопросы по тегам