编写扩展方法来调用控件的更好方法?

2023-12-08

我有这个通用函数来调用 WinForm 控件:

public static void Invoke(this Control c, Action action)
{
    if (c.InvokeRequired)
        c.TopLevelControl.Invoke(action);
    else
        action();
}

我正在考虑通过引入更严格的约束来防止出现无意义的事情来使其变得更好,可能是这样的:

button1.Invoke(() => list.Add(1));

还可能存在多余的输入,例如:

button1.Invoke(() => button1.Hide());

因为我们已经指定了this is button1.

所以我做到了:

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

现在我得打电话,

button1.Invoke((c) => c.Hide());

or

button1.Invoke((c) => button1.Hide());

现在我感觉即使这样,输入的内容也超出了要求。如果我指定this is button1,那么在 lambda 表达式中我不想指定虚拟变量c再次告诉在哪里进行操作。无论如何,我可以再把它缩短吗?也许喜欢

button1.Invoke(Hide);

or

button1.Hide.Invoke();

或者在 C# 中是这样?


为了构建其他答案,我会将其放入一个单独的扩展类中。

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

这将防止TargetParameterCountException避免在跨线程时被抛出。

To Call:

button1.Invoke(x => x.Hide());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编写扩展方法来调用控件的更好方法? 的相关文章

  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern

随机推荐

  • vim 中按名称对函数进行排序

    Vim 可以使用 sort 命令对行进行排序 我想使用 vim 对源代码中的函数进行排序 例如 前 def a pass def c pass def b pass after def a pass def b pass def c pas
  • 图像-Xamarin.Form

    我已经实现了一个登录页面 现在我想添加一个标题图像 但是 图像不会显示在视图上 public LoginView InitializeComponent Title Login Content new StackLayout Spacing
  • 如何在Asp.net CORE MVC中的浏览器上下载PDF文件

    我使用下面的代码来下载 pdf 格式的 SSRS 报告 string URL http ssrs test com ReportS UAT FOLDER URL URL SRNo 122 rs Command Render rs Forma
  • 在调试模式下启动服务器时,阻止 Eclipse 自动打开调试透视图

    有几个关于堆栈溢出的示例 说明如何在调试器激活 即遇到断点 这可以通过以下方式实现 首选项 gt 运行 调试 gt 透视图 gt 当应用程序挂起时打开关联的透视图 我的问题不是这个 每当我启动我的服务器在调试模式下 将打开调试透视图 由于我
  • std::vector 中如何管理动态内存?

    std vector如何实现对元素数量变化的管理 是使用realloc 函数 还是使用链表 Thanks 它使用作为第二个模板参数提供给它的分配器 那就这样吧 假设它在push back中 让t是要推送的对象 if size capacit
  • angularjs ng-repeat 按数字顺序排序字符串数组

    我有一个 id 类似的帖子列表1 2 3 4 5 6 7 8 9 10 11 12 json格式 id 的类型为字符串 但我想按照它的数字顺序来排序 正常 orderBy fiche id 列表显示如下 1 10 11 12 2 3 4 5
  • 在 Matlab 中使用 dlmcell 换行 - 在 Notepad++ 中显示,但在记事本中不显示

    我正在使用 Matlab 中的 dlmcell 函数来输出文本 每次使用 dlmcell 附加时 我都希望在新行上显示文本 当我在 Notepad 中打开书面文档时 每个文本片段都会按照我的需要换行 然而 用windows自带的记事本打开
  • 使用C库函数设置系统时间

    我可以使用 struct tm 和 time localtime asctime 获取系统时间 但是我需要有关如何使用 C 程序设置系统时间的帮助 如果您不想执行 shell 命令 您可以 正如您提到的 使用 settimeofday 我将
  • 如何创建具有值映射的自定义悬停工具

    我正在尝试创建一个自定义悬停工具 使用该工具获取绘图的 y 值并将该值映射到不同的值 到目前为止我可以想出的实现此功能的代码是 from bokeh models import HoverTool import holoviews as h
  • 将 ZonedDateTime 转换为字符串

    我需要将当前时间作为字符串存储在数据库中 时间可以位于不同的时区 因此我正在考虑使用 Java SE 8 的新 ZonedDateTime 类 我注意到 toString 方法自动输出 2016 04 15T17 40 49 305 05
  • PHP 每隔周三选择一次

    我需要帮助 选择从 2012 年 5 月 2 日开始每隔一个星期三 下面的代码选择从当前所在周开始每隔一个星期三 但我需要设置开始周 我熟悉 PHP 但不熟悉 php 日期 所以请尽可能具体 我找到了这个 number of dates 1
  • 使用 Jackson 注释序列化和解包 POJO 中的 Map 对象

    我有一个 POJO 其属性名为 paramMap 作为 Map 类型 import java util HashMap import java util Map import com fasterxml jackson annotation
  • 时间序列中的每小时平均值

    这是一个具有每小时智能电表数据且 freq 24 的时间序列 它是在三天内测量的 所以first day 1 24 second 25 48 third 49 72 我想要三天内每小时的平均值 例如 t 1 t 25 t 49 3 这样我就
  • 如何仅将 CSV 中的唯一值添加到 ComboBox 中?

    我想读取 csv 文件并将单词 Jakarta 和 Bandung 放入组合框中 这是输入 id from 1 Jakarta 2 Jakarta 5 Jakarta 6 Jakarta 10 Bandung 11 Bandung 12 B
  • ORA-28040: 没有匹配的身份验证协议

    即使按照以下设置 我仍然面临这个问题 更换ojdbc14 jar with ojdbc6 jar 也尝试过ojdbc5 jar Added SQLNET ALLOWED LOGON VERSION SERVER 8 到 sqlnet ora
  • 精灵套件中的裁剪/蒙版圆形图像节点会产生锯齿状边缘

    是否可以为没有锯齿状边缘的图像节点提供圆形蒙版 裁剪 按照苹果公司的这个例子 https developer apple com reference spritekit skcropnode 结果并不理想 您可以点击链接查看 let sha
  • 从服务获取登录用户名

    我有一项必须登录本地管理员才能安装的服务 此服务的目的是在用户登录或注销时记录其用户名 我终于找到了一些我认为可以工作的WMI代码 但它仍然返回管理员 为什么这不起作用 var query new ObjectQuery SELECT FR
  • 放大/缩小时保持地图上 D3 对象大小不变

    我正在遵循以下示例http bl ocks org d3noob raw 5193723 示例中绘制的圆圈在放大时会增大 我无法找出保持圆圈大小相同的方法 有任何想法吗 Edit1 关于如何保持饼弧半径恒定的任何想法 我已经找到了保持圆半径
  • WPF 网页浏览器控件与 winforms

    我正在创建一个 wpf 应用程序 其中使用网络浏览器控件 无论如何 有时我需要查找 html 元素 调用点击和其他基本功能 在 winforms webbrowser 控件中 我可以通过执行以下操作来实现此目的 webBrowser1 Do
  • 编写扩展方法来调用控件的更好方法?

    我有这个通用函数来调用 WinForm 控件 public static void Invoke this Control c Action action if c InvokeRequired c TopLevelControl Invo