将委托作为变量存储/传递

2023-12-08

我对 C# 相当陌生,正在研究一种使用串行通信来实现动态 GUI 的方法。我是C出身,所以函数指针的概念很熟悉。

基本上我想在处理串行命令时调用answerFunction() 函数。 理论上:
我有一个类 lbl_txtBox_Pair ,它是在运行时动态创建的。
我有一个与串行端口通信的 comObject 类。
我有一个第三类 comPacket,它保存有关一个串行命令的所有信息。

  1. 在 lbl_txtBox_Pair 类的对象中,我实例化一个数据包并告诉它串行命令完成后应调用哪个函数。
  2. 我将数据包对象赋予 comObject 实例。
  3. 处理后,comObject 希望通过调用存储在数据包对象中的委托来向数据包的原始发送者发出信号。

由于某种原因我无法让它工作。它告诉我数据包的属性不可调用。我做错了什么吗?

这是代码: 首先是“lbl_txtBox_Pair”类中的代码。我在这里创建 comPacket 并将其交给 comObject。

public delegate void answerHandler( comPacket packet);
public void txb_value_KeyPress(object sender, KeyPressEventArgs e)
{
   if (e.KeyChar == (char)Keys.Return)
   {
      answerHandler answerMethod = new answerHandler(this.processAnswer);
      comPacket question = new comPacket(this.command, answerMethod, 1);
      comObject.addPacket(question);
    }
 }

comPacket 的构造函数。此处存储委托以供稍后调用。

public Delegate answerFunction;
public comPacket(string cmd, Delegate func, int prio)
{
    this.cmd = cmd;
    answerFunction = func;
    this.prio = prio;
}

在 comObject 中,数据包得到处理。完成后我想调用数据包中存储的函数。顺便说一句,comObject 在不同的线程中运行。

if (this.isEndtocken(inputline))
 {
    listen = false;
    packet.answerFunction(packet);
 }

这就是它破裂的地方。 packet.answerFunction(packet);不会执行并表示它不能作为方法调用。

有人能看出哪里出了问题吗?我认为委托人似乎丢失了它是委托人之类的信息。 或者我是否必须完全重构代码才能使用其他类型的回调/事件方法?


改变你的comPacket接受强类型委托:

public answerHandler answerFunction;
public comPacket(string cmd, answerHandler func, int prio)
{
    this.cmd = cmd;
    answerFunction = func;
    this.prio = prio;
}

如果您仍然想保留委托引用弱类型,您可以利用DynamicInvoke反而:http://msdn.microsoft.com/en-us/library/system.delegate.dynamicinvoke.aspx

编辑:如果您想维护强类型委托但具有不同用途,另一种选择是利用泛型。您的委托可以放置在泛型类中,并将其签名与该泛型类型联系起来。

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

将委托作为变量存储/传递 的相关文章

  • C# AES Rijndael - 检测无效密码

    我正在使用 Rijndael 加密程序中的一些敏感数据 当用户输入错误的密码时 大多数情况下CryptographicException抛出消息 填充无效且无法删除 然而 CryptStream 不会抛出密码错误的异常 而是返回错误解密的流
  • C# 中的 Culture 相当于 Java 中的 Locale 吗?

    C 使用文化的概念 这在操作上与 Java 中的 Locale 类似吗 或者底层概念是否存在显着差异 从文化而不是语言环境的角度进行工作是一种寻找正确抽象层次的尝试 从以类似方式做事的人群的角度来考虑事物 而不是谈论地理区域和语言 并有点疯
  • 如何指定CMAKE外部项目的编译器?

    我使用ExternalProject Add 包含一个外部项目 我想要的是能够做到 cmake DCMAKE CXX COMPILER
  • 将内核链接到 PTX 函数

    我可以使用 PTX 文件中包含的 PTX 函数作为外部设备函数 将其链接到另一个应调用该函数的 cu 文件吗 这是另一个问题CUDA 将内核链接在一起 https stackoverflow com questions 20636800 c
  • F# 内联如何工作?

    对于 F 我的理解是您可以使用 inline 关键字在调用站点执行类型专门化 那是 val inline a gt b gt c when a or b static member a b gt c 约束条件是 a or b必须有一个静态成
  • 在 DefaultHttpContext 上使用 FeatureCollection 时,响应对象为 null

    我正在测试一些 net Core 中间件 并希望使用整个 asp net Core http 管道来运行中间件 而不是模拟它 问题是 当我使用特征集合时 不知何故 响应对象没有在 httpRequest 中设置 并且它在请求本身上是只读的
  • “volatile void function( ... )” 做了什么?

    我见过从语法角度来看 C 函数中 volatile 关键字有多少种用法 https stackoverflow com questions 7643528 how many usage does volatile keyword have
  • 使用 for 循环创建链表

    这是我的结构 struct ListItem int data struct ListItem next 假设链表的第一个节点的 data 0 我想编写一个 for 循环来创建大小为 5 的链表 但我不知道如何工作 我尝试了以下方法 int
  • DLL 中的 XP 风格组合框

    我需要使用 C 和 WIN32 API 无 MFC 在 DLL 中创建 XP 风格的组合框 我设法在 DLL 中创建控件 不是以 XP 风格 我设法在带有清单的 exe 中创建 XP 样式组合框 但它在 DLL 中不起作用 为了让您的 DL
  • C++ std:.auto_ptr 或 std::unique_ptr (支持多个编译器,甚至是旧的 C++03 编译器)?

    我正在尝试更新一些 C 代码 我想转向更现代的代码 c 11 但我仍然需要使用一些较旧的编译器 兼容 c 03 来编译代码 因为支持的平台限制 我知道在 C 11 编译器中 std auto ptr 已被弃用 但由于较旧的编译器支持 我不能
  • MPI_Gatherv:根数组中收到的垃圾值

    我正在尝试实施MPI Gatherv函数于C 根据我的程序 包括 root 在内的每个进程都应该创建一个大小等于 进程的等级 1 这将在所有单元格中保持进程的等级 然后这个本地数组被收集到根的 rcv array 中 不知何故 我得到了垃圾
  • Global.asax 错误处理程序或自定义 IHttpModule 错误处理程序未捕获未处理的异常

    我有一个类 DPCal EventMove 的一种方法 我想限制使用角色的访问 我有一个 Global asax cs 错误处理程序和一个自定义 IHttpModule 错误处理程序 旨在捕获未处理的异常 并将它们 Server Trans
  • 如何从句柄确定进程是 32 位还是 64 位?

    如何从使用 OpenProcess 获取的进程句柄中获取信息 无论进程是 32 位还是 64 位 是的 IsWow64Process 毫无用处 令人烦恼 它的真正意思是 启用了 32 位模拟 如果您在 32 位操作系统上运行 则返回 fal
  • 将函数作为函数参数传递

    Unity C 似乎无法识别Func lt gt 作为函数委托的符号 那么 如何将函数作为函数参数传递呢 我有一个想法Invoke functionName 0 可能有帮助 但我不确定它是否实际上立即调用该函数 或者等待帧结束 还有别的办法
  • 从 Perl 线程生成 Expect

    我正在编写一个脚本 该脚本需要定期 每 5 分钟 生成一个 Expect 进程来完成一些工作 下面是我的代码 它生成一个 Expect 进程并执行一些工作 脚本的主要进程始终在做一些其他工作 例如它可能等待用户输入 因为我在一个线程中调用这
  • C# 记录类型:记录子类之间的相等比较

    给定父记录类型 public record Foo string Value 和两个记录子类Bar and Bee我想知道是否可以实施Equals在基类中 因此 Foo Bar 或 Bee 的实例都被考虑equal基于Value 两者都与E
  • MonoGame 中的 ContentLoadException

    我一直在尝试使用 Xamarin Studio 在 MonoGame 中加载纹理 我的代码设置如下 region Using Statements using System using Microsoft Xna Framework usi
  • 没有运算符“<<”与这些操作数匹配[重复]

    这个问题在这里已经有答案了 不知道发生了什么事 我查看了与此问题类似的其他帖子 但到目前为止没有解决方案有帮助 这是带有错误部分注释的代码 在某一时刻 它说 不起作用 而在代码的其余部分中 它说 include
  • 如何通过Task.ContinueWith创建传递?

    我想在原始任务结束时添加一个任务 但想保留原始结果和类型 附加任务仅用于记录目的 例如写入控制台等 例如 Task Run gt DateTime Now Hour gt 12 Hey throw new Exception Continu
  • 散列 hash_hmac 时,Convert.ToChar(0) 散列结果与 PHP 中的 chr(0) 不同的字符串

    我在 PHP 中有一个字符串 它被转换为字节数组并进行哈希处理 转换为字节数组的字符串如下所示 G 字符 0 便便 我需要 C 中的等效字节数组 这样我才能得到相同的哈希值 编辑 这是完整的问题 生成的哈希值不同 PHP api secre

随机推荐

  • 在 PHP 和 JavaScript 之间交换变量

    选定的单选按钮将通过下拉框显示其相应的城市列表 例如 选择单选按钮 安大略省 后 将显示一个包含匹配城市的下拉框 在本例中 地区 是安大略省 ID 是 77 下面示例中提到的所有 PHP 函数 循环和 JavaScript 代码都工作正常
  • 如何查找给定时间范围内特定文件被修改的次数[关闭]

    Closed 这个问题是无关 目前不接受答案 如何在 Unix 客户端中查找给定时间范围 即过去 2 天内 特定文件被修改的次数 正如所见UNIX 和 Linux 堆栈交换 Linux 为文件提供了三种时间戳 上次访问时间 内容 时间 内容
  • 如何解决weblogic的jar包与应用程序的jar包冲突

    我遇到了我的应用程序的 jar 和 weblogic 容器的 jar 之间的 jar 冲突问题 我正在寻求您的帮助 情况是这样的 我试图从另一个 Web 服务内部调用一个 Web 服务 并且这两个 Web 服务都托管在我的本地 Weblog
  • Apple 拒绝我的应用程序,因为不包含允许用户从“文件”应用程序查看或选择项目的功能

    在我的应用程序中 我使用以下方法从图库获取视频 void imagePickerController UIImagePickerController picker didFinishPickingMediaWithInfo NSDictio
  • 一个插座双堆栈

    我正在开发双栈客户端 服务器通信 我很好奇 我是否必须打开两个套接字 一个用于 IPv4 一个用于 IPv6 还是可以选择打开一个用于 IPv6 的套接字 并且它能够同时使用 IPv4 和 IPv6 连接 例如 如果我打开这样的套接字 SO
  • 输入带小数点的数值的最佳方法是什么?

    在我的应用程序中 用户需要能够输入带小数位的数值 iPhone 不提供专门用于此目的的键盘 仅提供数字键盘和带有数字和符号的键盘 有没有一种简单的方法可以使用后者并防止输入任何非数字输入 而无需对最终结果进行正则表达式 Thanks 我认为
  • 段落内的 HTML 标签

    我正在开展一个小型 鞋子尺寸 项目 用户应该能够阅读有关特殊鞋子的文章 读者可以通过按钮选择在文章中获取欧盟或美国尺寸 我的问题是 我怎样才能最好地做到这一点 因为我实际上不想创建一个新的 p 标签内的 p p tag p p This i
  • 在 Swift 中以编程方式制作 UIButton

    我正在尝试使用 Swift 以编程方式构建 UI 我怎样才能让这个动作发挥作用 override func viewDidLoad super viewDidLoad Do any additional setup after loadin
  • 如何使用 POCO 库将 C++ 对象传输到 Web 服务

    我有一个使用 Qt 和 openCV 的图像处理应用程序 对于每一帧 我应该将捕获的 cv Mat 图像对象发送到服务器以对其进行处理并获取结果 我应该使用 REST 架构 因为它的负载较低 我应该使用什么工具将 cv Mat 发送到服务器
  • 使用 Solver Foundation 进行约束规划的缺点

    使用 Microsoft Solver Foundation for CLP 有哪些缺点 Solver 确实在 Express Standard 版本中提供了一些支持 但可以想象 人们需要购买昂贵的 Gurobi Knitro 附加组件才能
  • 使用 #pragma GCC Optimize 优化 C 代码

    我正在尝试使用 GCC pragma optimization 在我的 C 代码中设置全局优化 Ubuntu 上的 GCC 版本是 4 4 3 基本思想是使用特定于功能的优化级别 pragma GCC optimize O3 我收到编译错误
  • Jackson 使用 Spring MVC 重复嵌套对象未反序列化

    我正在尝试将以下 POJO 转换为 JSON RestController Entity Table name user location NamedQuery name UserLocation findAll query SELECT
  • Swift Admob 控制台显示模拟器设备 ID,但在 iPhone 上运行时不显示?

    我已经在我的项目中实现了 Admob 但是我无法为我的 iPhone 添加测试设备 ID 这是代码 let request GADRequest myAd GADInterstitial adUnitID ca app pub 441173
  • OpenMP 大大减慢了 for 循环速度

    我正在尝试通过 OpenMP 并行化来加速这个 for 循环 我的印象是这应该将工作分成多个线程 然而 也许开销太大 无法给我带来任何加速 我应该提到这个循环发生了很多很多次 并且循环的每个实例都应该并行化 循环迭代次数 newNx 可以小
  • 如何 db:seed 模型及其所有嵌套模型?

    我有这些课程 class User has one user profile accepts nested attributes for user profile attr accessible email password passwor
  • 仅使用 Javascript 将事件监听器添加到不存在的对象

    我搜索了整个 stackoverflow 但没有针对这个问题得到任何好的结果 如果我错了 请纠正我 我想向 DOM 中存在或不存在的对象添加EventListener 在Jquery中我们可以简单地执行以下代码 document on cl
  • aspnet core实体框架7自引用“作业”1对多表

    我有一个包含职位的 职位 表 事实上 工作并不总是一次性完成的 您可以拥有一份需要多次访问的工作 我打算将其表示为另一项工作 但通过自引用 linkId 链接回原始工作 我无法使用 Fluent API 来表示这一点 它是一对多的关系 一项
  • 有没有办法在没有 GUI 的情况下从特定行运行 MATLAB 脚本?

    有没有办法在不使用 GUI 的情况下从特定行运行 MATLAB 脚本 在 GUI 中我使用 Thanks 可以写入一个函数 该函数将读取脚本 m 文件 跳过行直到需要的行 并将其余行写入临时 m 文件 然后运行它 或者从 line1 到 l
  • Flutter 升级 Flutter 版本后运行 pod install 时出错

    flutter版本升级到最新的Flutter 2 2 1后 在ios模拟器上运行app时 运行pod install时报错 我尝试通过执行以下命令来清洁 Pod 但它没有解决问题 flutter clean flutter pub get
  • 将委托作为变量存储/传递

    我对 C 相当陌生 正在研究一种使用串行通信来实现动态 GUI 的方法 我是C出身 所以函数指针的概念很熟悉 基本上我想在处理串行命令时调用answerFunction 函数 理论上 我有一个类 lbl txtBox Pair 它是在运行时