如何从 Lambda 表达式的字符串动态创建方法

2024-04-14

我的最终目标是创建一个函数,将方法名称动态传递给 Hangfire 库中的类。

例如,以下是有效的非动态代码:

RecurringJob.AddOrUpdate(() => myFunction(), Cron.Hourly)

AddOrUpdate 第一个参数的类型是Expression<Action>。我的第一步是使用反射动态插入函数名称:

Type thisControllerType = this.GetType();
MethodInfo method = thisControllerType.GetMethod(methodName); //methodName passed as string parameter
RecurringJob.AddOrUpdate(() => method.Invoke(this, null), Cron.Hourly);

当我检查 Hangfire 仪表板时,似乎该表达式被评估为MethodBase.Invoke。所以我需要帮助动态传递方法名称。

这可能足以回答我的问题,但我采取的另一条途径是尝试生成参数的完整表达式。

RecurringJob.AddOrUpdate(CreateCallExpression(method), Cron.Hourly);

public Expression<Action> CreateCallExpression(MethodInfo method)
    {
        //trying to pass in zero argument parameter, not sure if this syntax is correct    
        var parameter = System.Linq.Expressions.Expression.Parameter(typeof (Array));
        return System.Linq.Expressions.Expression.Lambda<Action>(System.Linq.Expressions.Expression.Call(method, parameter));
    }

在这种情况下,我收到异常{“静态方法需要空实例,非静态方法需要非空实例。\r\n参数名称:方​​法”}。我正在努力,但不确定这是否是我应该走的路。我一整天都在研究这个问题,所以我希望有人能够帮助我加快学习速度。


您的第二个实例将用于创建指向指定方法的指针,但要解决静态问题,您只需以两种方式之一修改以下行。首先,您可以通过声明您寻求静态的方法并修改这行代码来完成静态引用:

System.Linq.Expressions.Expression.Call(method, parameter);

您必须为调用方法提供一个空参数,因为如果您正在搜索静态方法,那么编译器将确切地知道您想要的方法签名,因为只会存在 1。代码行将更新为:

System.Linq.Expressions.Expression.Call(null, method, parameter); 

第二种方法是定义与方法相关的类或“实例”,以便编译器知道要在哪个类中搜索方法签名。您必须像这样修改您的代码:

var myInstance = Expression.Parameter(typeof(MyClass), "inst");
System.Linq.Expressions.Expression.Call(myInstance, method, parameter)

我建议查看文档Call http://msdn.microsoft.com/en-us/library/bb349020(v=vs.110).aspx这样您就可以确切地知道指针是如何创建的。

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

如何从 Lambda 表达式的字符串动态创建方法 的相关文章

  • 如何在 Perl 中循环访问类的所有方法?

    如何在 Perl 中循环访问一个类的所有方法 有没有关于 Perl 内省或反射的好的在线参考 Todd Gardner 使用 Moose 的建议很好 但他选择的示例代码并不是很有帮助 如果你正在检查一个非 Moose 使用类 你会这样做 u
  • 如果 JSON.NET 中的值为 null 或空格,则防止序列化

    我有一个对象需要以这样的方式序列化 即 null 和 空白 空或只是空格 值都不会序列化 我不控制对象本身 因此无法设置属性 但我知道所有属性都是字符串 环境NullValueHandling显然 忽略 只能让我找到解决方案的一部分 它 似
  • 将 OpenCV Mat 转换为数组(可能是 NSArray)

    我的 C C 技能很生疏 OpenCV 的文档也相当晦涩难懂 有没有办法获得cv Mat data属性转换为数组 NSArray 我想将其序列化为 JSON 我知道我可以使用 FileStorage 实用程序转换为 YAML XML 但这不
  • 在 ASP.NET MVC 中将模型从视图传递到控制器

    我正在 ASP NET MVC 中开发我的第一个应用程序 但遇到了一个我无法解决的问题 即使在阅读了整个互联网之后也是如此 因此 我有几个使用视图模型创建的视图 它们是报告 这些视图模型是根据用户选择标准填充的 我正在尝试构建一种接受模型并
  • 如何以编程方式播放 16 位 pcm 数组 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个包含 16 位 pcm 值的短 数组 我希望能够在不添加任何标题 也不将任何文件保存到内存的情况下播放它 我知道我可能需要一个提供
  • 将下拉列表与字典绑定

    我将字典绑定到下拉列表 举例来说 我的字典中有以下项目 Test1 123 Test2 321 我希望下拉文本采用以下格式 Test1 Count 123 Test2 Count 321 我沿着以下路径走 但没有运气 MyDropDown
  • C 中“complex”的默认类型

    根据我读过的文档 C99 和更高版本的支持float complex double complex and long double complex作为复杂类型 但是 此代码在使用时编译时不会发出警告gcc Wall Wextra inclu
  • 如何使用 Roslyn 通过扩展方法、静态类中的方法以及带有 ref/out 参数的方法来访问调用

    我正在致力于创建一个开源项目 用于创建 NET UML 序列图 该项目利用名为 js sequence diagrams 的 javascript 库 我不确定 Roslyn 是适合这项工作的工具 但我想我应该尝试一下 所以我整理了一些概念
  • Java 中通用方法参数的 getClass()

    以下 Java 方法无法编译
  • Xamarin - SignalR 挂在连接上

    我正在尝试将我的 Xamarin 应用程序连接到托管在 Azure 上的 SignalR 后端 我遇到的问题是每次我在 HubConnection 上调用 StartAsync 时 它都会挂起客户端并且请求永远不会完成 我尝试通过应用程序进
  • 时间:2019-03-17 标签:c++fstream并发访问

    如果从不同的进程 线程同时访问文件会发生什么 据我所知 没有锁定文件的标准方法 只有操作系统特定的功能 就我而言 文件将被经常读取而很少写入 现在如果A打开一个文件进行读取 ifstream 并开始读取块 和B打开相同的文件进行写入 ofs
  • doxygen c++:记录由“using”声明公开的私有继承成员

    作为一个例子 我有以下课程 class A public void methodOne class B private A public Brief description using A methodOne 我还没有找到强制 doxyge
  • ALTER TABLE ... ADD CONSTRAINT 失败时将事务回滚到保存点

    有没有办法在事务中添加检查约束and如果失败回滚到以前的保存点 而不是回滚整个事务 就我而言 当 ALTER TABLE ADD CONSTRAINT 命令失败时 事务无法回滚到保存点 尝试这样做会引发 InvalidOperationEx
  • EnumDisplayDevices 与 WMI Win32_DesktopMonitor,如何检测活动监视器?

    对于我当前的 C 项目 我需要为在大量计算机上连接并处于活动状态的每个监视器检测一个唯一的字符串 研究指出了两种选择 使用 WMI 并查询 Win32 DesktopMonitor 以获取所有活动监视器 使用 PNPDeviceID 来唯一
  • 浮点字节序?

    我正在为实时海上模拟器编写客户端和服务器 并且由于我必须通过套接字发送大量数据 因此我使用二进制数据来最大化可以发送的数据量 我已经了解整数字节顺序以及如何使用htonl and ntohl为了规避字节顺序问题 但我的应用程序与几乎所有模拟
  • Autoconf 问题:“错误:C 编译器无法创建可执行文件”

    我正在尝试使用 GNU 自动工具构建一个用 C 编写的程序 但显然我设置错误 因为当configure运行 它吐出 configure error C compiler cannot create executables 如果我看进去con
  • Linq.Select() 中的嵌套表达式方法调用

    I use Select i gt new T 每次手动点击数据库后将我的实体对象转换为 DTO 对象 以下是一些示例实体和 DTOS 用户实体 public partial class User public int Id get set
  • 如何将 int 作为“void *”传递给线程启动函数?

    我最初有一个用于斐波那契变量数组的全局变量 但发现这是不允许的 我需要进行基本的多线程处理并处理竞争条件 但我无法在 pthread 创建中将 int 作为 void 参数提供 我尝试过使用常量指针 但没有成功 由于某些奇怪的原因 void
  • 将 Swagger 与命名空间版本的 WebApi 结合使用

    我已经找到了如何使用基于名称空间的 WebAPI 版本这个班 https aspnet codeplex com SourceControl changeset view dd207952fa86 Samples WebApi Namesp
  • 运行测试项目时自动启动ASP.MVC项目

    我正在尝试为我的 ASP 网站设置一个测试项目 对于某些测试 我想使用 selenium 来执行端到端测试 因此 我的网站必须运行 以便测试可以访问该网站 运行测试时如何启动我的网站项目 请参考以下链接 我相信这是可能的 但会有点棘手 这些

随机推荐

  • Visual Studio 2012(RTM,在 Windows 8 RTM 上)中没有带断点的 XAML 绑定调试?

    将我的 Silverlight 5 解决方案升级到 Visual Studio 2012 RTM 然后更新到 Windows 8 RTM 后 我注意到当您在 XAML 中设置断点时 您会在调试模式下看到以下工具提示 当前不会命中断点 找不到
  • 是否可以定义带有可变参数的宏,并获取每个参数的类型?

    下面是一个明显的可变参数函数 def fun xs Any 我们可以用类似的方式定义一个宏 def funImpl c Context xs c Expr Any fun 1 1 1 0 但在本例中 所有参数都键入为Any 事实上 编译器在
  • PGP TarBall 文件签名密钥验证失败,未找到有效的 OpenPGP 数据

    这是我第一次认为我最好检查我要安装的绑定软件的密钥 所以我下载了我认为是 OpenPGP 密钥的东西 wget ftp ftp isc org isc bind9 9 9 4 bind 9 9 4 tar gz sha1 asc 然后我尝试
  • Typeof/instanceof 类型别名

    我想知道是否可以确定打字稿中对象的类型 请考虑下面的例子 type T number boolean class B foo T 3 true bar boolean return this foo instanceof T typeof
  • 对整数向量使用 _mm_shuffle_ps 的影响

    SSE内在函数包括 mm shuffle ps xmm1 xmm2 immx它允许人们从中选择 2 个元素xmm1与 2 个元素连接xmm2 然而 这是针对浮点数的 由 ps 单个包装 但是 如果你转换你的压缩整数 m128i 那么你可以使
  • java GC如何清理相互关联的对象

    谁能告诉我相互引用的对象会怎样 java的GC是如何解决这个问题的 提前致谢 如果您有对象 A 和 B 并且满足以下条件 A 对 B 的引用 B 对 A 的引用 没有其他对象引用其中任何一个 它们不是根对象 例如常量池中的对象等 然后 这两
  • VBSCRIPT 将文件上传到服务器

    我正在尝试制作一个脚本来将任何文件上传到简单的 html php 上传表单 我找不到任何不使用 ASP 的工作脚本 这是我最接近的代码 VBS Dim strURL Dim HTTP Dim dataFile Dim dataRequest
  • iOS(React Native):使用 React 导航呈现的标题顶部不必要的空间

    路由配置 Author Rahul Date 25 Feb 2018 Routes flow import React from react import View Text from react native import StackNa
  • Oracle 11g 向后兼容较旧的 Oracle 版本

    我们的组织正计划将其大部分 Oracle 服务器和客户端升级到 11g 第 2 版 但我们的一个客户端系统仍然使用oracle 8i安装 我们可以从oracle 11g客户端访问Oracle 8i的对象吗 一些博客说它应该起作用 而另一些则
  • 从表中删除<字段最大数量的记录并保留最大数量

    我知道这听起来相当令人困惑 但我不知道如何更好地解释它 我有一个简化的表格如下 DB Type ID Table1 1 Table1 2 Table1 3 Table1 4 Table1 5 Table2 6 Table2 7 Table2
  • 如何使用 Flutter Navigator 推送多条路由

    如果我将颤动中的路线推送到应用程序的深处 是否有任何方法可以提供额外的路线 以便可以自定义后退 向上导航 您可以致电Navigator push https api flutter dev flutter widgets Navigator
  • C++ 中奇怪的方括号表示法,看起来有点像 foreach 循环

    代码如下所示 auto generateHash std vector
  • Java获取无线网络的SSID等信息

    我正在尝试用 Java 获取无线网络设备的 SSID 我尝试了官方网络教程http java sun com docs books tutorial networking nifs retriving html http java sun
  • 无需root设备即可卸载系统应用程序

    有没有办法在不root设备的情况下将apk推送到系统 应用程序文件夹 我找到了几种在 root 设备上执行此操作的方法 但我正在寻找一种无需先 root 设备即可执行此操作的方法 如果有任何区别 我想在三星 S4 上执行此操作并使用 twr
  • 如何在远程服务器上使用 gpg 签名密钥?

    有没有办法在Linux上通过gpg程序 命令行工具 在远程服务器中使用gpg密钥进行签名 我正在使用 gpg 使用测试密钥在本地主机上签署二进制文件 现在我想使用服务器访问的相同类型的密钥 我正在通过更改 gpg 工具的参数来寻找实现 你可
  • BIM服务器数据库访问

    我是一名 Java 开发人员 最近我公司正计划使用BIM Server 概念是 BIM 服务器将与我们当前的项目集成 我们将通过一些 API 访问 BIM 服务器数据库 我与本地 BIM 服务器建立连接 创建项目并使用 JsonBimSer
  • 如何找到字符列的MAX()值?

    我们有遗留表 其中复合键的列部分之一手动填充了值 code 001 002 099 etc 现在 我们有一个功能请求 其中我们必须知道 MAX code 才能为用户提供下一个可能的值 在示例情况下 上面的下一个值是 100 我们尝试对此进行
  • 禁用除第一列之外的每一列的排序

    我目前正在将数据表用于自定义系统 我想对除第一列之外的每一列禁用排序 我尝试使用以下代码 当我添加用逗号分隔的值时 它工作正常 aoColumnDefs bSortable false aTargets 1 2 3 4 但我的表列号因每个单
  • SQL Server 中的条件 WHERE 子句

    我正在创建一个 SQL 查询 其中需要条件where条款 它应该是这样的 SELECT DateAppr TimeAppr TAT LaserLTR Permit LtrPrinter JobName JobNumber JobDesc A
  • 如何从 Lambda 表达式的字符串动态创建方法

    我的最终目标是创建一个函数 将方法名称动态传递给 Hangfire 库中的类 例如 以下是有效的非动态代码 RecurringJob AddOrUpdate gt myFunction Cron Hourly AddOrUpdate 第一个