包含实例方法委托的静态字典

2024-03-18

我有一个带有巨大 switch 语句的方法,如下所示:

public bool ExecuteCommand(string command, string args)
{
    bool result = false;
    switch (command)
    {
        case "command1": result = Method1(args); break;
        case "command2": result = Method2(args); break;
        // etc.
    }
    return result;
}
private bool Method1(string args) {...}

现在我想用字典替换它Func<>委托,以便我可以消除 switch 语句:

private Dictionary<string, Func<string, bool>> _commands = new ...;
public MyClass()
{
    _commands.Add("command1", Method1);
    // etc:
}
public bool ExecuteCommand(string command, string args)
{
    return _commands[command](args);
}

我看到的问题是,一个新的字典被实例化并填充了 MyClass 的每个新实例。

是否有可能以某种方式使该字典(包含实例方法的委托)成为静态成员,在静态构造函数中仅初始化一次?

例如。像这样的东西(不起作用):

private static Dictionary<string, Func<string, bool>> _commands = new ...;
static MyClass()
{
    // the following line will result in a compiler error:
    // error CS0120: An object reference is required for the non-static field,
    // method, or property 'MyClass.Method1(string, string)'
    _commands.Add("command1", MyClass.Method1);
}

You can在静态构造函数中初始化它 - 但您需要创建实例MyClass,这可能不是您想要的,因为我假设您希望命令在实例的“上下文中”执行Execute已被召唤。

或者,您可以使用委托填充字典,其中take的一个实例MyClass同样,像这样:

class MyClass
{
    static Dictionary<string, Func<MyClass, string, bool>> commands
        = new Dictionary<string, Func<MyClass, string, bool>>
    {
        { "Foo", (@this, x) => @this.Foo(x) },
        { "Bar", (@this, y) => @this.Bar(y) }
    };

    public bool Execute(string command, string value)
    {
        return commands[command](this, value);
    }

    public bool Foo(string x)
    {
        return x.Length > 3;
    }

    public bool Bar(string x)
    {
        return x == "";
    }
}

理论上,我相信通过创建“开放委托”,无需 lambda 表达式就可以实现,但使用反射需要做更多的工作。如果你不介意丑陋的话tiny额外间接的性能损失,我认为这种方法应该效果很好。

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

包含实例方法委托的静态字典 的相关文章

  • Volatile.Read 和 Volatile.Write 背后的逻辑是什么?

    来自 MSDN Volatile Read 读取字段的值 在需要它的系统上 插入一个 阻止处理器重新排序内存的内存屏障 操作如下 如果在该方法之后出现读或写 代码 处理器无法移动它before这个方法 and Volatile Write
  • JSON.Net 反序列化返回“null”

    我正在使用 JSON Net 反序列化 JSON 字符串 JSON 字符串是 string testJson Fruits Apple color red size round Orange Pro
  • XPATH 查询、HtmlAgilityPack 和提取文本

    我一直在尝试从名为 tim new 的类中提取链接 我也得到了解决方案 给出了解决方案 片段和必要的信息here https stackoverflow com questions 2982862 extracting a table ro
  • 叮当错误?命名空间模板类的朋友

    以下代码在 clang 下无法编译 但在 gcc 和 VS 下可以编译 template
  • 并行化斐波那契序列生成器

    我正在学习并行化 在一项练习中 我得到了一些我应该提高性能的算法 其中之一是斐波那契数列生成器 array 0 0 array 1 1 for q 2 q lt MAX q array q array q 1 array q 2 我怀疑 这
  • 如果 JSON.NET 中的值为 null 或空格,则防止序列化

    我有一个对象需要以这样的方式序列化 即 null 和 空白 空或只是空格 值都不会序列化 我不控制对象本身 因此无法设置属性 但我知道所有属性都是字符串 环境NullValueHandling显然 忽略 只能让我找到解决方案的一部分 它 似
  • 司机和提供商之间的区别

    数据库中的驱动程序和提供程序有什么区别 有没有解释一下 不胜感激 样本 ADO NET driver for MySQL vs providerName System Data EntityClient 来自 MSDN 论坛 驱动程序是安装
  • 将设置函数(setter)标记为 constexpr 的目的是什么? [复制]

    这个问题在这里已经有答案了 我无法理解将 setter 函数标记为的目的constexpr 自 C 14 起这是允许的 我的误解来自以下情况 我使用 constexpr c tor 声明一个类 并且我将通过创建该类的 constexpr 实
  • C# 处理标准输入

    我目前正在尝试通过命令行断开与网络文件夹的连接 并使用以下代码 System Diagnostics Process process2 new System Diagnostics Process System Diagnostics Pr
  • 为什么需要数字后缀?

    C 语言 我确信还有其他语言 需要在数字文字末尾添加后缀 这些后缀指示文字的类型 例如 5m是一个小数 5f是一个浮点数 我的问题是 这些后缀真的有必要吗 或者是否可以从上下文中推断出文字的类型 例如 代码decimal d 5 0应该推断
  • 有什么方法可以重载 C# 中的扩展方法吗?

    我有以下模型模式 public abstract class PARENTCLASS public class CHILD A CLASS PARENTCLASS public static class EXTENSION public s
  • Resharper:IEnumerable 的可能多重枚举

    我正在使用新的 Resharper 版本 6 在我的代码中的几个地方 它给一些文本加了下划线 并警告我可能存在IEnumerable 可能的多重枚举 我理解这意味着什么 并在适当的情况下采纳了建议 但在某些情况下 我不确定这实际上是一个大问
  • EnumDisplayDevices 与 WMI Win32_DesktopMonitor,如何检测活动监视器?

    对于我当前的 C 项目 我需要为在大量计算机上连接并处于活动状态的每个监视器检测一个唯一的字符串 研究指出了两种选择 使用 WMI 并查询 Win32 DesktopMonitor 以获取所有活动监视器 使用 PNPDeviceID 来唯一
  • 无法在 C# 中为 EventArgs 分配使用派生类型的事件处理程序

    所以我有一个事件声明如下 public event EventHandler OnChangeDetected 然后我有以下处理程序被分配给该事件 myObject OnChangeDetected OnTableChanged 我的理解是
  • C 中使用 getrandom 实现随机浮点数

    我试图生成一个介于 0 和 1 之间的随机浮点数 无论是在 0 1 还是 0 1 对我来说都不重要 网上关于此的每个问题似乎都涉及rand 呼叫 播种time NULL 但我希望能够每秒多次调用我的程序 并每次都获得不同的随机数 这引导我找
  • 如何在dll级别读取app.config? [复制]

    这个问题在这里已经有答案了 我在一个解决方案中有一个控制台应用程序项目和库项目 dll The 图书馆项目有 app config 文件 我在其中存储我在库中使用的一些键值对 控制台应用程序引用此 dll 我有另一个 app config
  • Linq.Select() 中的嵌套表达式方法调用

    I use Select i gt new T 每次手动点击数据库后将我的实体对象转换为 DTO 对象 以下是一些示例实体和 DTOS 用户实体 public partial class User public int Id get set
  • printf或iostream如何指定点后的最大位数

    字符串采用什么格式printf or iomanip我应该使用 iostream 中的运算符以以下格式打印浮点数 125 0 gt 125 125 1 gt 125 1 125 12312 gt 125 12 1 12345 gt 1 12
  • 如何在c linux中收听特定接口上的广播?

    我目前可以通过执行以下操作来收听我编写的简单广播服务器 仅广播 hello int fd socket PF INET SOCK DGRAM 0 struct sockaddr in addr memset addr 0 sizeof ad
  • 为什么表达式 a = a + b - ( b = a ) 在 C++ 中给出序列点警告?

    以下是测试代码 int main int a 3 int b 4 a a b b a cout lt lt a lt lt a lt lt lt lt b lt lt b lt lt n return 0 编译此命令会出现以下警告 gt g

随机推荐

  • 如何消除 XCode 5 / iOS 7 中的图标眩光?

    我正在使用 XCode 5 开发者预览版来创建 iOS 7 应用程序 在iOS 7中 图标的眩光效果不再存在 没关系 但现在 当我在 iOS 6 设备 或模拟器 上运行由 XCode 5 编译的应用程序时 我看到图标上有眩光效果 禁用眩光的
  • 尝试为 linq 中的日期创建大于、等于或大于动态过滤器

    我一直在尝试为 Linq 创建一个表达式树过滤器 它接受 2 个日期和一串可能的值 小于 等于 大于 我希望将调用格式设置为 Query Where CompareDates x gt x left right less than 我有代码
  • 从标准输入读取密码[重复]

    这个问题在这里已经有答案了 场景 一个交互式 CLI Python 程序 需要密码 这也意味着 没有可能的 GUI 解决方案 在 bash 中 我可以读取密码 而无需在屏幕上重新提示 read s Python 有类似的东西吗 IE pas
  • 如何上传到 Dropbox Public 文件夹并获取公共 URL?

    我遇到一种情况 我需要将文件上传到我的 Dropbox 公共文件夹 并且上传后我需要存储上传文件的公共 url 我正在使用 python 对此的任何帮助都会很棒 Thanks 使用它在您的程序中设置 Python SDK https www
  • iOS 推送通知问题

    我正在做一个项目 其中推送通知功能是关键特征之一 当我在应用程序中时它工作正常 我收到通知并处理该通知 但问题是当我在后台并收到通知时 我在应用程序图标上看到徽章 当我单击该图标时 我的应用程序正在启动 但是didReceiveRemote
  • 在 ASP.Net Core 中创建自定义 HTML 帮助器

    我想创建自己的自定义 HTML Helper 就像 ASP NET MVC 中使用的那样 但我一直无法找到如何以正确的方式实现它们 我已经找到了如何创建自定义标记帮助程序 但没有找到 HTML 帮助程序 如何创建我自己的自定义 HTML 帮
  • 从 onLoadFinished() 中的光标填充小部件

    我想知道如何使用CursorLoader填充屏幕上的小部件 网上的所有示例仅适用于使用适配器 而且效果很好 我需要的是一种可靠的方法来从光标和 UI 线程上更新屏幕中的视图 并且有时不会因为以下原因而崩溃StaleDataException
  • 它有一些专门针对 tibble 和管道内衬副作用的函数吗?

    我想知道是否可以使用 dplyr select dplyr mutate 或 dplyr transmute 等函数来调用副作用函数 我有步行 但不是来自同一家庭 tibble as tibble mtcars gt dplyr trans
  • Chrome for IOS 无法在 iframe 中正确打开新窗口

    我正在尝试在 iframe 内的 Chrome for iOS 中的新窗口中打开链接 但 Chrome for iOS 不会在新窗口中打开链接 而是浏览器在同一窗口中而不是在新窗口中打开链接 对于弹出窗口也是如此 很奇怪 Example 测
  • 带有不可见项目的微格式 hreview

    我正在一个网站上实现微格式的 hreview 部分 以供 Google 索引 http www google com support webmasters bin answer py answer 146645 http www googl
  • 确保文件在 JVM 退出时被删除

    即使 JVM 提前终止 File deleteOnExit 是否也能保证文件被删除 正如蒂姆 本德所说 File deleteOnExit 不保证文件确实被删除 但是 在 Unixish 系统 例如 Linux 或 OSX 上 可以删除临时
  • 如何在同一个存储库中保留/维护公共和私有代码? (在存储库托管处)

    我正在开发自己的项目 该项目分为两部分 A 内核 通用代码 公共部分 B 适用于专有协议等的代码 私有部分 可供我和一些授权人员使用 我想要存储库托管 可能是 github assembla 它允许在同一存储库中的公共和私有分支中工作 我不
  • 向 sqlite 数据库添加列

    我正在尝试将在 R 中生成的向量作为新列添加到 sqlite 表中 为此我想使用dplyr 我安装了最新的开发版本以及dbplyr根据这篇文章打包here https www r bloggers com dplyr 0 6 0 comin
  • 标签中可以包含任何类型的标签吗?

    是否有诸如 div div
  • Cakephp 2.0 和基本身份验证

    我已将我的应用程序从 CakePHP 1 3 升级到 2 0 4 以前 我只能在一个控制器中使用安全组件来模拟基本 HTTP 身份验证 我曾经做过这样的事情 this gt Auth gt allow array this gt Secur
  • 使用 sqlparse 解析 CASE WHEN 语句

    我有以下 SQL 查询并想使用它来解析它sqlparse https github com andialbrecht sqlparse import sqlparse query select SUM case when A dt unix
  • postgres docker 容器中的 pg_restore

    我正在尝试使用 pg restore 从将从 docker 文件调用的 shell 脚本中恢复 PostgreSQL docker 容器中的数据库 我收到以下错误 错误 取消自动清理任务 CONTEXT 自动分析表 tablename Do
  • SwitchPreference (PreferenceAtivity) - Android NULL

    我有一个屏幕首选项 因此使用了 PreferenceActivity 我已经构建了所有内容并正常运行 但是通过单击文本 SwitchPreference 即行上的任何位置而不位于同一开关中 他可以使用手机 版本 4 1 2 因空指针异常而爆
  • 如何在 Apache Airflow 中正确处理夏令时?

    在气流中 一切都应该是 UTC 不受 DST 影响 但是 我们的工作流程可以根据受 DST 影响的时区交付内容 一个示例场景 我们安排了一项作业 开始日期为东部时间上午 8 00 计划间隔为 24 小时 每天东部时间上午 8 点 调度程序会
  • 包含实例方法委托的静态字典

    我有一个带有巨大 switch 语句的方法 如下所示 public bool ExecuteCommand string command string args bool result false switch command case c