封装 Action 和 Func

2024-01-30

我正在尝试为某种 IExecutable 接口进行设计。我不会详细介绍,但重点是我有几个需要从基类执行的操作。它们可能采用不同的参数(没什么大不了的),并且它们可能/可能不返回值。

到目前为止,这是我的设计:

public abstract class ActionBase
{
    // ... snip ...
}

public abstract class ActionWithResultBase<T>: ActionBase
{
    public abstract T Execute();
}

public abstract class ActionWithoutResultBase: ActionBase
{
    public abstract void Execute();
}

到目前为止,我的每个具体操作都需要是 ActionWithResultBase 或 ActionWithoutResult 基的子级,但我真的不喜欢这样。如果我可以将 Execute 的定义移至 ActionBase,考虑到具体类可能会也可能不会返回值,那么我将实现我的目标。

有人告诉我这可以通过使用 Func 和 Action 来完成,我完全同意,但我找不到一种方法将其放入一个类中,以便调用者知道该操作是否会返回一个值或不是。

简介:我想做一些类似的事情:

// Action1.Execute() returns something.
var a = new Action1();
var result = a.Execute();

// Action2.Execute() returns nothing.
var b = new Action2();
b.Execute();

如果您想要一个轻量级的解决方案,那么最简单的选择是编写两个具体的类。其中一个将包含 type 的属性Action另一个是 type 的属性Func<T>:

public class ActionWithResult<T> : ActionBase { 
  public Func<T> Action { get; set; } 
}

public class ActionWithoutResult : ActionBase {
  public Action Action { get; set; }
}

然后你可以像这样构造两种类型:

var a1 = new ActionWithResult<int> { 
  CanExecute = true,
  Action = () => { 
    Console.WriteLine("hello!");
    return 10; 
  }
}

如果你不想做Action属性读/写,那么您可以将操作委托作为参数传递给构造函数并使该属性只读。

C# 需要两个不同的委托来表示函数和操作,这一事实非常烦人。人们使用的一种解决方法是定义一个类型Unit表示“无返回值”并使用它代替void。那么你的类型就是Func<T>你可以使用Func<Unit>代替Action. The Unit类型可能如下所示:

public class Unit {
  public static Unit Value { get { return null; } }
}

创建一个Func<Unit>值,你会写:

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

封装 Action 和 Func? 的相关文章

  • 是否可以强制 XMLWriter 将元素写入单引号中?

    这是我的代码 var ptFirstName tboxFirstName Text writer WriteAttributeString first ptFirstName 请注意 即使我使用 ptFirstName 也会以双引号结束 p
  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • 当 contains() 工作正常时,xpath 函数ends-with() 工作时出现问题

    我正在尝试获取具有以特定 id 结尾的属性的标签 like span 我想获取 id 以 国家 地区 结尾的跨度我尝试以下xpath span ends with id Country 但我得到以下异常 需要命名空间管理器或 XsltCon
  • 如果使用 SingleOrDefault() 并在数字列表中搜索不在列表中的数字,如何返回 null?

    使用查询正数列表时SingleOrDefault 当在列表中找不到数字时 如何返回 null 或像 1 这样的自定义值 而不是类型的默认值 在本例中为 0 你可以使用 var first theIntegers Cast
  • 使用 System.Text.Json 即时格式化 JSON 流

    我有一个未缩进的 Json 字符串 例如 hash 123 id 456 我想缩进字符串并将其序列化为 JSON 文件 天真地 我可以使用缩进字符串Newtonsoft如下 using Newtonsoft Json Linq JToken
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • 当操作繁忙时,表单不执行任何操作(冻结)

    我有一个使用 C 的 WinForms 应用程序 我尝试从文件中读取一些数据并将其插入数据表中 当此操作很忙时 我的表单冻结并且无法移动它 有谁知道我该如何解决这个问题 这可能是因为您在 UI 线程上执行了操作 将文件和数据库操作移至另一个
  • 将 unsigned char * (uint8_t *) 转换为 const char *

    我有一个带有 uint8 t 参数的函数 uint8 t ihex decode uint8 t in size t len uint8 t out uint8 t i hn ln for i 0 i lt len i 2 hn in i
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我
  • 恢复上传文件控制

    我确实阅读了以下帖子 C 暂停 恢复上传 https stackoverflow com questions 1048330 pause resume upload in c 使用 HTTP 恢复上传 https stackoverflow

随机推荐

  • 如何在 Java 中将 OpenLayers DrawFeature 与 Selenium WebDriver 一起使用(双击问题)?

    我正在测试一个基于 OpenLayers 的 GIS API 我使用 Selenium WebDriver 来执行测试 我现在正在尝试测试 OpenLayers DrawFeature 它在绘制点时效果很好 需要单击一下 但对于直线和多边形
  • Android 2.3不传递html5音频标签Get请求的cookie信息

    我正在尝试使用 android 2 3 中的 html5 音频标签从安全站点播放媒体文件 但我注意到在 Get 请求中 android 2 3 不会将 cookie 信息从浏览器传递到服务器 从而导致 HTTP 1 1 302 暂时移动 服
  • 从 numpy.uint8 数组中提取无符号字符

    我有代码从 python 序列中提取数值 并且在大多数情况下效果很好 但不适用于 numpy 数组 当我尝试提取无符号字符时 我执行以下操作 unsigned char val boost python extract
  • 在网页视图中使用深色模式

    我似乎无法让 android web 视图使用深色主题或使用 media prefers color scheme dark 我正在使用带有 DayNight 主题的 AndroidX 有没有人有一个在 api 29 之前向后兼容的解决方案
  • C 以二进制模式读/写文件

    我创建了一个包含 4000 个块的文件 块大小为 4096 字节 现在我想操作单个块并再次读取它们而不更改文件的大小 实际上我想将另一个文件中的块写入我创建的文件中的特定块 因此 我以二进制模式打开文件 如下所示 FILE storeFil
  • Windows 批处理文件中等效的 Switch 语句

    我想知道是否有一种简单的方法可以根据一个表达式的值在 Windows 批处理文件中分支执行 类似于 C C C Java JavaScript PHP 和其他实际编程语言中的 switch case 块 我唯一的解决方法是一个简单的 if
  • SDK/ADT 更新后 Android 库依赖关系被破坏

    今天 我将 Android SDK 和 Eciple ADT 更新到最新版本 ADT Rev 22 重新启动 Eclipse 后 每当我引用自定义库时 它都会对构建路径感到非常不满意 An example is shown in this
  • Javascript 映射二维数组

    我有这个数组 rows 89 18 9 1903 3 4 3 1 800 它应该看起来像这样 89 1903 3 18 3 1 9 4 800 正在运行的代码如下所示 rows 0 map columnIndex gt rows map r
  • Spring Elastic Search 自定义字段名称

    我是 Elastic Search 的新手 我正在尝试使用 Spring data elasticsearch 来实现它 我的弹性搜索文档中有一些名称为 Transportation Telephone Number 的字段 当我尝试将我的
  • 用于通配符 url 映射的 Kubernetes Ingress 控制器

    我需要我的每个用户都可以通过自定义网址访问服务 例如 abccompany mycloudapp com 每个服务都是 kubernetes 服务 我正在查看入口控制器 但我需要一种使用通配符主机字段并以某种方式将值读入 path 和 se
  • #someDiv 是什么意思? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 当用户将鼠
  • Google Datastore 模拟器从本地数据库中删除数据

    我的本地计算机 Mac OSX 10 11 6 上运行着一个本地数据存储模拟器实例 我已经有一堆数据了 但我想从本地数据库中删除所有数据 从头开始 不过 我已经尝试删除存储数据的目录 我认为的目录 启动模拟器时会出现此消息 WARNING
  • VS2015中sprintf()和wsprintf()的格式差异

    我正在将一些代码从多字节移动到 unicode 并发现我的字符串格式出现错误 看起来 Visual Studio 2015 在 sprintf 和 wsprintf 之间处理宽度参数说明符 的方式不同 这是编译器错误或副作用 还是我错过了一
  • Angular 9 PWA 哈希不匹配(cacheBustedFetchFromNetwork)

    我有一个 Angular PWA 它无法离线启动 http 错误 504 当我检查 ngsw state 时 出现此错误 Error Hash mismatch cacheBustedFetchFromNetwork https examp
  • codeigniter 分页 - 每个页面上的结果保持相同

    我正在使用 Codeigniter 分页 但遇到了问题 url 在点击时发生变化 如限制更新 例如displayAllUsers 10 到 displayAllUsers 15 但结果保持不变 这是我的控制器 public function
  • C# XAMARIN.FORMS 中的超链接按钮

    我想创建具有点击可能性的标签 就像在 WIN 手机 xaml 中一样
  • 获取 openX 的域详细信息以及 Portrait_id 和 Landscape_id

    我刚刚下载了 OpenX android sdk 并尝试将其指向本地创建的域 但看起来它对我来说效果不佳 布局中的 OXMAdBanner 看起来像
  • 如何从事件处理程序获取 jquery 选择器

    我在页面上有几个输入元素 其中一个 第一个 是我可以输入任何其他元素的特定 ID 的地方 我希望我的代码以这样的方式设置 当我关注任何其他元素并且其 id 与第一个元素中输入的文本匹配时 它会突出显示 并在其中显示指示我选择了正确元素的文本
  • “更改表重命名”和“重命名表”有什么区别?

    我正在使用MySQL 举个例子 我想将表A重命名为B 那么下面的语句有什么区别 alter table A rename to B 和这个 rename table A to B 谁能详细比较一下它们之间的情况吗 是否会根据不同的发动机而有
  • 封装 Action 和 Func

    我正在尝试为某种 IExecutable 接口进行设计 我不会详细介绍 但重点是我有几个需要从基类执行的操作 它们可能采用不同的参数 没什么大不了的 并且它们可能 可能不返回值 到目前为止 这是我的设计 public abstract cl