Как удалить функцию после того, как она была выполнена один раз
У меня есть функция, которая должна выполняться при событии с переключателем, но это нужно сделать только один раз. В последующих событиях, отмеченных переключателем, моя функция не должна вызываться.
void rb_CheckedChanged(x, y)
{
LoadSomeData(); //need to load only once.
// rest of the code; to be executed every single time..
}
Замечания:
я хочу
LoadSomeData()
быть выполненным только под событием переключателя.Я могу установить целочисленную переменную-член, и сделать 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]
этот атрибут может иметь свойство, которое указывает, был ли метод уже запущен