代码之家  ›  专栏  ›  技术社区  ›  Ian

使扩展方法泛型化

  •  1
  • Ian  · 技术社区  · 16 年前

    post

    public static void InvokeIfRequired(this Control c, Action<Control> action)
    {
        if(c.InvokeRequired)
        {
            c.Invoke(() => action(c));
        }
        else
        {
            action(c);
        }
    }
    

    我想做的是做一个通用版本,这样我就不受控件的约束。例如,这将允许我执行以下操作(因为我不再被限制为一个控件)

    this.progressBar1.InvokeIfRequired(pb => pb.Value = e.Progress);
    

    我试过以下方法:

      public static void InvokeIfRequired<T>(this T c, Action<T> action) where T : Control
        {
            if (c.InvokeRequired)
            {
                c.Invoke(() => action(c));
            }
            else
            {
                action(c);
            }
        }
    

    但我得到以下错误,我不知道如何修复。有什么建议吗?

    3 回复  |  直到 9 年前
        1
  •  4
  •   Thomas Levesque    16 年前

    替换:

    c.Invoke(() => action(c));
    

    使用:

    c.Invoke(action, c);
    
        2
  •  0
  •   Community Mohan Dere    9 年前

    这是lambdas和匿名方法的一个众所周知的错误:

    Convert this delegate to an anonymous method or lambda

    您的代码只需要一个cast即可编译:

    public static void InvokeIfRequired<T>(this T c, Action<T> action) where T : Control
    {
        if (c.InvokeRequired)
        {
            c.Invoke((Action<T>)((control) => action(control)));
        }
        else
        {
            action(c);
        }
    }
    
        3
  •  0
  •   ckramer    16 年前

    public static void InvokeIfRequired<T>(this T c, Action<T> action) where T : Control
    {
        if (c.InvokeRequired)
        {
            c.Invoke((Action<T>)(() => action(c)));
        }
        else
        {
            action(c);
        }
    }
    

    您需要将其转换为委托类型。我知道有点蠢。我真的不能给你一个很好的理由来解释为什么lambda表达式不能作为委托隐式赋值。

    推荐文章