【问题标题】:How to remove a function after it has been executed once如何在执行一次后删除函数
【发布时间】:2011-10-27 02:23:50
【问题描述】:

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

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 等。或者一个布尔标志。这不是我要找的。​​p>

谢谢..

【问题讨论】:

    标签: c# winforms function methods c#-2.0


    【解决方案1】:

    您可以设置hidden field 并将其用作标志来确定您是否应该再次运行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" />
    

    【讨论】:

    • 你好,这个隐藏字段是什么?什么类型的?
    • 好吧,我不知道有关&lt;asp:HiddenField ID="hiddenField" Value="False" /&gt; 的任何信息。我不会去的。我在想诸如我们如何删除事件处理程序之类的事情。我们可以用函数做到这一点吗?
    • 我在HiddenField 类的答案中添加了一个链接。你也会在那里找到一个例子。
    • 我以为你在一个 aspx 页面中?但情况似乎并非如此。这是一个 Windows 窗体应用程序吗?
    • 没问题,如果您需要 ASPX 的类似功能,您知道去哪里找 :)
    【解决方案2】:

    我认为选项 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..
    }
    

    【讨论】:

    • @nawfla:我知道,但据我所知,我相信这是唯一的方法
    • @nawfal:您到底在寻找什么?魔法 ?在框架或语言中没有规定您要尝试做什么,那么您还想要什么?使用标志是实现您所追求的最简单的方法。其他任何事情都只会成为研究和尝试的有趣事物。这就是你所追求的吗?
    • @mrlucmorin,当然不是魔法伙伴,毕竟这不是 Ruby ;)。努力了解 .net 中是否有更好/标准/专业/优雅/正确的编码技术或任何类型的编译器技巧来处理此类情况,毕竟这不是一次性的情况。自从我知道删除代表和事件处理程序后,我就会想到这样的事情。这些都是非常方便的技巧。我为什么不考虑它的兄弟姐妹这样的事情呢?顺便说一句,Waqas 和 hcb 已经发布了两个很酷的方法..
    • @nawfal,我完全同意 Waqas 和 hcb 提出的解决方案非常新颖,但是如果您仔细观察两者,您会发现它们仍然依赖于某种标志来指示是否执行代码与否,所以这就是为什么我问你在追求什么。我当然没有阻止你提问。只是想了解你试图用 voodoo 解决的问题 ;-)
    • 是的,它们确实依赖于标志,但它们不是更多的标准解决方案吗?我有三个这样的场合来避免不必要的数据加载,因此创建一个方法列表(由 Waqas 提供)对我来说非常棒..
    【解决方案3】:

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

    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

    【讨论】:

    • 有没有像我们为事件处理程序那样删除函数的方法?
    • 如果你的意思是添加事件处理程序(+=)和删除事件处理程序,那么没有
    • An object reference is required for the nonstatic field, method, or property 'System.Type.InvokeMember(string, System.Reflection.BindingFlags, System.Reflection.Binder, object, object[])' 为什么会出现这个错误?
    • 你必须创建一个'Type'类型的对象,你不能调用Type.InvokeMember(...),因为它不是一个静态方法。我建议你阅读它的文章我已经在我的 asnwer 中发布了链接。
    【解决方案4】:

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

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

    PostSharp Link

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-10
        • 1970-01-01
        相关资源
        最近更新 更多