如何从 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 表达式的字符串动态创建方法 的相关文章

  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 按成员序列化

    我已经实现了template
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • JQuery Mobile 与 MVC 的链接

    我正在使用 ASP NET MVC 3 和 Razor UI 设置 JQuery 移动网站 我正在生成我的链接 例如 a href See Group 2 a 假设我从 Home Index 访问它 我遇到的问题是 当我点击链接时 它会出现
  • 如何使用 LAMBDA 表达式在 LINQ 中执行 IN 或 CONTAINS?

    我有以下 Transact Sql 我正在尝试将其转换为 LINQ 并且很挣扎 SELECT FROM Project WHERE Project ProjectId IN SELECT ProjectId FROM ProjectMemb
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 重载<<的返回值

    include
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐

  • 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 第一个