如何在函数执行一次后删除它

本文关键字:一次 删除 函数 执行 | 更新日期: 2023-09-27 18:05:49

我有一个函数要在单选按钮选中的事件下执行,但它必须只执行一次。在随后的单选按钮选中的事件中,我的函数不应该被调用。

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

注意:

  1. 我希望LoadSomeData()只在单选按钮事件下执行。

  2. 我可以设置一个整数成员变量,并做计数++,n检查如果== 1等。或者一个布尔标志。这不是我想要的

谢谢. .

如何在函数执行一次后删除它

您可以做的是创建一个您想在事件中调用的函数名称列表,然后从列表中获取方法名称,使用反射调用您感兴趣的方法,然后从列表中删除该方法名称…下一次,当事件再次被调用时,该方法将不会被执行,直到它不在列表中。比如:

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

获取有关动态方法调用的信息。

您可以设置一个隐藏字段,并将其用作确定是否应该再次运行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" />

我认为选项2是你最好的选择,在它周围有一个粘性bool

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

你可以用PostSharp [RunOnce]创建一个属性

这个属性可以有一个属性来指示方法是否已经被触发

PostSharp链接

我选择第二个选项,但你可以使用委托:

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