C# 3.0 使扩展方法通用
这里有一种非常有趣的方法,可以使用静态扩展方法更新UI线程C# 3.0 使扩展方法通用,c#-3.0,C# 3.0,这里有一种非常有趣的方法,可以使用静态扩展方法更新UI线程 public static void InvokeIfRequired(this Control c, Action<Control> action) { if(c.InvokeRequired) { c.Invoke(() => action(c)); } else { action(c); } } 我尝试了以下方法: public
public static void InvokeIfRequired(this Control c, Action<Control> action)
{
if(c.InvokeRequired)
{
c.Invoke(() => action(c));
}
else
{
action(c);
}
}
我尝试了以下方法:
public static void InvokeIfRequired<T>(this T c, Action<T> action) where T : Control
{
if (c.InvokeRequired)
{
c.Invoke(() => action(c));
}
else
{
action(c);
}
}
publicstaticvoid invokeifrequered(这个tc,Action-Action),其中T:Control
{
如果(c.invokererequired)
{
c、 调用(()=>动作(c));
}
其他的
{
行动(c);
}
}
但我得到了以下错误,我不知道如何修复。有什么建议吗
错误5无法将lambda表达式转换为类型“System.Delegate”,因为它不是委托类型
这是lambdas和匿名方法的一个众所周知的错误: 您的代码只需要转换即可编译:
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);
}
}
publicstaticvoid invokeifrequered(这个tc,Action-Action),其中T:Control
{
如果(c.invokererequired)
{
c、 调用((操作)((控制)=>操作(控制));
}
其他的
{
行动(c);
}
}
这是lambdas和匿名方法的一个众所周知的错误:
您的代码只需要转换即可编译:
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);
}
}
publicstaticvoid invokeifrequered(这个tc,Action-Action),其中T:Control
{
如果(c.invokererequired)
{
c、 调用((操作)((控制)=>操作(控制));
}
其他的
{
行动(c);
}
}
试试这个小小的变化:
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);
}
}
publicstaticvoid invokeifrequered(这个tc,Action-Action),其中T:Control
{
如果(c.invokererequired)
{
c、 调用((动作)(()=>动作(c));
}
其他的
{
行动(c);
}
}
您需要将其强制转换为委托类型。我知道有点傻。我不能给你一个很好的理由来解释为什么lambda表达式不能作为委托隐式赋值 试试这个小小的变化:
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);
}
}
publicstaticvoid invokeifrequered(这个tc,Action-Action),其中T:Control
{
如果(c.invokererequired)
{
c、 调用((动作)(()=>动作(c));
}
其他的
{
行动(c);
}
}
您需要将其强制转换为委托类型。我知道有点傻。我不能给你一个很好的理由来解释为什么lambda表达式不能作为委托隐式赋值 替换:
c.Invoke(() => action(c));
与:
c.Invoke(action, c);
替换:
c.Invoke(() => action(c));
与:
c.Invoke(action, c);
事实上再仔细看一下,我似乎也发现了第一个代码示例中的错误。。。虽然我现在正在编译.NET4.0。事实上。。。再仔细看一下,我似乎也发现了第一个代码示例中的错误。。。尽管我目前实际上正在为.NET 4.0进行编译,但它不会工作,因为
action
接受一个参数,而您不会将其传递给Invoke
good point。编辑以说明这一点。出于某种原因,我认为调用是在当前控件中传递的,但事实并非如此。它不会起作用,因为action
接受一个参数,而您不会将其传递给Invoke
good point。编辑以说明这一点。出于某种原因,我认为调用是在当前控件中传递的,但事实并非如此。它也不起作用。您需要向Invoke
方法提供操作的参数,但该方法也不起作用。您需要向Invoke
方法提供操作的参数