具有不同返回类型和参数数量的 Func 委托列表

2023-11-30

我有一个类需要在构造函数中传递不同数量的 Func 委托。这些委托中的每一个都将指向不同的函数,每个函数都有不同的返回类型,并且具有不同数量的参数(双精度类型)。然后将相应地调用每个函数。

问题 1. 现在,为了让使用此类的人更容易,我正在考虑允许用户传递List<object>Func 代表的数量。这是否可能,如果可以,我是否能够确定方法中每个 Func 所需的返回类型和参数数量List<object>被传递给(即构造函数)?

问题 2. 如果上述方法不可行,我是否需要使用返回类型/参数数量的每种不同组合来重载构造函数,并相应地路由每个 Func -_- ...如果没有,有人可以指出我正确的方向吗?我觉得我正在以错误的方式处理这个问题......

注意 - 来自 python 背景,我会做这样的事情(我在 c# 方面缺乏经验):

import inspect
def test(x): return x
inspect.getargspec(test)

returns: ArgSpec(args=['x'], varargs=None, keywords=None, defaults=None)

非常感谢


问题 1:现在,为了让使用此类的人更容易,我正在考虑允许用户传递 Func 委托列表。这是否可能,如果可以,我是否能够确定将 List 传递到的方法(即构造函数)中每个 Func 所需的返回类型和参数数量?

并不真地。你可以允许List<Delegate>(或元素类型为的其他一些集合Delegate),但什么也没有Func- 具体的,有两个原因:

  • Func实际上是一个family类型,具有不同数量的泛型类型参数。就 CLR 而言,这些类型是完全独立的;Func<TResult> and Func<T, TResult>是不同的Action<T> and EventHandler.

  • 即使您只处理相同泛型委托类型的多个值,它们可能具有不同类型参数这一事实意味着它们对于 CLR 来说是不同的类型;没有办法说List<Func<>>对于“具有可能不同类型参数的函数列表”。同样,CLR 将它们视为单独的类型 - 尽管这一次至少具有共同的泛型类型定义。

问题 2. 如果上述方法不可行,我是否需要使用返回类型/参数数量的每种不同组合来重载构造函数,并相应地路由每个 Func

嗯,有几种选择:

  • 使所有参数可选,并为每个参数指定默认值null,然后在调用构造函数时使用命名参数:

     var foo = new Foo(clickHandler: () => ...,
                       keyHandler: key => ...);
    
  • 创建一个构建器,以便可以将各种函数设置为属性 - 这非常适合对象初始值设定项语法:

     var foo = new Foo.Builder {
                   ClickHandler = () => ...,
                   KeyHandler = () => ...
               }.Build();
    

当然,后两种解决方案都取决于您是否确实具有特定的指定目的。

如果您能更清楚地了解您想要实现的目标,这将会有所帮助 - 正如 dtb 所说,多态性may更适合这里。您可以创建一个带有虚拟方法的无操作实现的抽象类,并且实现可以选择要重写的方法。

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

具有不同返回类型和参数数量的 Func 委托列表 的相关文章

随机推荐

  • 关于数据模型与数据格式之间的区别

    我最近必须向观众解释数据模型和数据格式之间的区别 他们想要解释为什么我们不使用 XML 来完成我们使用 RDF 所做的基本工作 虽然我可以解释很多东西 比如分布式数据模型 推理等等 我在某种程度上能够解释数据模型和数据格式之间的区别 我想知
  • 设置位置与设置当前目录

    Powershell 之间有什么区别 Set Location env ProgramFiles My App and System IO Directory SetCurrentDirectory env ProgramFiles My
  • Flutter发布APK:Linux(deepin)密钥库格式无效

    我尝试使用 Flutter 发布 APK 但出错了 任务 app packageRelease 执行失败 无法从存储 home jerome key jks 读取密钥 密钥库格式无效 My storePassword and keyPass
  • SQLSTATE[22007]:无效的日期时间格式:1292 不正确的日期时间值:'2008-03-30 02:56:12'

    系统 本地 PHP 5 6 19 使用 Laravel 5 0 制作的应用程序 使用 fzaninotto Faker 作为播种器 MySQL远程 远程MySQL Debian 8 与 MariaDB 10 1 13 MariaDB 1 j
  • 绘制动画 openlayers 线串路径

    我在上面看到了一个令人印象深刻的映射示例http jerusalem com map tour the way of the cross location abu jaafar 有人如何使用 openlayers 在点的绘制路径上完成类似的
  • 如何返回这个数组中唯一不重复的值? [复制]

    这个问题在这里已经有答案了 我有一个关于 Javascript 的问题 这是以下数组 1 0 0 0 0 0 0 我想返回唯一不重复的值 即1 有什么建议么 我有这个 var result arr filter x gt arr index
  • Windows Phone 导航 - 返回之前的页面

    我想点击一个按钮将我带到一个页面 然后单击一个列表框项 单击新页面上的按钮并将其传回之前的页面 而无需创建第一页的新 URI First Page private void btnAddExistingMember Click object
  • 如何从 JSON 字符串中提取单个元素?

    我想从下面给出的数据中提取值 屏幕名称 姓名 ID 个人资料图片 URL id str 135977294 description 4TechCareers is the u2018insiders u2019 view of TechCa
  • OnClick 用于谷歌分析和目标 _blank。链接失效了?

    a href http example com test html class noFloat target blank Click Me a 我对这段代码有疑问 不返回 false 我有一个新窗口 没关系 但相同的网址也在同一个父窗口中打
  • 禁止打印 REPL 中原子保存的数据? (或参考人、代理人……)

    以下是完全有效的 Clojure 代码 def a atom nil def b atom a reset a b 它甚至在需要反向引用的情况下很有用 然而 在 REPL 中处理这些东西很烦人 每当您键入 a 或 b 时 REPL 都会尝试
  • 如何创建 Directshow 过滤器?

    我想创建一个软件 作为视频流 H264 输入 来自另一个软件 输出为网络摄像头 供我的朋友可以在 Skype yahoo 或类似的设备中观看 我知道我需要创建 directshow 过滤器才能做到这一点 但我不知道必须创建什么类型的过滤器
  • 如何支持 CMake 中 Makefile 的构建时变量?

    虽然我已经完成了一些多平台 例如嵌入式与主机运行时环境 CMake 项目 但我有一个看似简单的用例 但我无法完全弄清楚 我所知道的典型 CMake 用法是这样的 mkdir
  • 如何为 StatEt Eclipse 插件的帮助视图索引 R 库?

    当我显示 StatEt Eclipse 插件的 R Help 视图时 出现以下错误 HTTP ERROR 404 Problem accessing rhelp browse default workbench Reason The R l
  • 如何将回调附加到 Google 应用制作工具中的自定义确认对话框?

    我正在 Google App Maker 中创建自定义确认对话框 并希望使用 确认 按钮来调用传入的函数 我在按钮小部件中没有看到 onclick 事件 关于如何执行此操作有什么建议吗 function confirmationDialog
  • 使用 MATLAB 将 2D 图像放入半球中

    我正在尝试将 2D 图像放入 3D 半球中 我有一张尺寸为 128x128 的图像 我生成我的半球 x y z sphere 127 x x 64 end y y 64 end z z 64 end Attempt warp x y z I
  • Django 查询自然排序

    假设我有这个 Django 模型 class Question models Model question code models CharField max length 10 我的数据库中有 15000 个问题 我想按以下方式排序问题代
  • 将位转换为整数

    我收到一个包含字节数组的数据包 我必须从中获取一些整数值 这是文档的一部分 有人能帮助我吗 这是一个 4 字节数组 年从 1990 到 2052 6 位 月从 1 到 12 4 位 日从 1 到 31 5 位 小时从 0 到 23 5 位
  • FlannBasedMatcher 返回不同的结果

    使用FlannBasedMatcher在 OpenCV 中 我使用相同的参数调用匹配器得到不同的结果 谁能建议我做错了什么 下面的代码显示了我遇到的问题的一个最小示例 它简化了我如何使用FlannBasedMatcher 这不是真正的代码
  • Java 中的访问器方法

    所以我对 setter 和 getter 方法以及它们是否有用有疑问 假设我只编写了一个非常基本的程序 如下所示 public class Account String name String address double balance
  • 具有不同返回类型和参数数量的 Func 委托列表

    我有一个类需要在构造函数中传递不同数量的 Func 委托 这些委托中的每一个都将指向不同的函数 每个函数都有不同的返回类型 并且具有不同数量的参数 双精度类型 然后将相应地调用每个函数 问题 1 现在 为了让使用此类的人更容易 我正在考虑允