使用表达式获取方法的名称

2024-05-21

我知道网站上有一些关于此问题的答案,如果这有任何重复,我深表歉意,但我发现的所有答案都没有做我想做的事情。

我正在尝试指定方法信息,以便我可以通过不使用字符串以类型安全的方式获取名称。 所以我试图用一个表达式来提取它。

假设我想获取此接口中方法的名称:

public interface IMyInteface
{
    void DoSomething(string param1, string param2);
}

目前我可以使用此方法获取名称:

 MemberInfo GetMethodInfo<T>(Expression<Action<T>> expression)
 {
        return ((MethodCallExpression)expression.Body).Method;
 }

我可以按如下方式调用辅助方法:

var methodInfo = GetMethodInfo<IMyInteface>(x => x.DoSomething(null, null));
Console.WriteLine(methodInfo.Name);

但我正在寻找不需要指定参数(null,null)即可获取方法名称的版本

像这样:

var methodInfo = GetMethodInfo<IMyInteface>(x => x.DoSomething);

但所有尝试都无法编译

有没有办法做到这一点?


x => x.DoSomething

为了使其可编译,我只看到两种方法:

  1. 采用非通用方式并将其参数指定为Action<string, string>
  2. Specify Action<string, string>作为您自己的目标委托类型:GetMethodInfo<IMyInteface>(x => new Action<string,string>(x.DoSomething))

如果你可以选择第二个,它允许你省略参数,那么你可以写你的GetMethodInfo方法如下:

    MemberInfo GetMethodInfo<T>(Expression<Func<T, Delegate>> expression)
    {
        var unaryExpression = (UnaryExpression) expression.Body;
        var methodCallExpression = (MethodCallExpression) unaryExpression.Operand;
        var methodInfoExpression = (ConstantExpression) methodCallExpression.Arguments.Last();
        var methodInfo = (MemberInfo) methodInfoExpression.Value;
        return methodInfo;
    }

它适用于您的界面,但可能需要一些概括才能使其适用于任何方法,这取决于您。

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

使用表达式获取方法的名称 的相关文章

随机推荐

  • 递归 lambda 表达式可能吗?

    我正在尝试编写一个调用自身的 lambda 表达式 但我似乎找不到任何语法 或者即使它是可能的 本质上我想将以下函数传输到以下 lambda 表达式中 我意识到这是一个愚蠢的应用程序 它只是添加 但我正在探索可以在 python 中使用 l
  • 多语言 Android 应用程序:在电子邮件和密码字段中显示英文键盘

    我们正在开发一款多语言 Android 应用程序 针对英语和阿拉伯语 面临的问题是在登录和注册屏幕中 我们希望仅以英文文本输入用户名和密码字段 从而显示英文键盘 无论设备区域设置语言如何 已尝试在 edittext 中设置 inputtyp
  • Ext JS - 如何滚动到文本区域的底部

    这是我下面的代码 如何滚动到文本区域的底部 它一定是类似的东西 Ext getCmp output setScrollPosition Ext getCmp output getScrollHeight 这是我的文本区域代码 var myW
  • 如何向 jQuery Tokeninput 添加占位符?

    如何将占位符添加到 jQuery Tokeninput 字段 一个正常的placeholder属性在这里不起作用 对于这样的输入
  • 指示brew doctor忽略特定的*.dylib文件

    我该如何指导brew doctor忽略特定的 dylib files e g brew doctor输出 Unexpected dylibs usr local lib libecomlodr dylib usr local lib lib
  • Android 谷歌地图 V2 已停止

    我正在尝试构建地图应用程序并关注这个链接 https blog emildesign rhcloud com p 435一步步 我在这里找到了类似的主题 但对我没有帮助 我想显示地图 但是当我运行它时 它返回强制关闭和我的 Android
  • Node.js 每个用户一个会话

    如何防止我的用户同时从两个设备登录我的系统 因此 如果用户从计算机登录 当他从不同的计算机登录时 首先会自动关闭会话 不需要使其实时 我使用node js express js mongoose passport connect mongo
  • Findbug - ANT xslt 样式表源代码参考

    我有一个 ANT 目标 它在同一源代码上运行 findbugs 两次以生成 xml 和 html 报告
  • C# 中的 H.264(或类似)编码器?

    有谁知道 C 或任何其他托管语言 的开源 H 264 编码器 我也许也可以用 python 实现 我发现的库 例如 x264 是用相当低级的 c 带有大量宏的程序 和汇编语言编写的 调整它们比我想象的要复杂得多 我的项目不关心性能或兼容性
  • Java:无安全管理器:RMI 类加载器已禁用

    您好 我有 RMI 应用程序 现在我尝试从客户端调用服务器上的一些方法 我有以下代码 public static void main final String args try Setting the security manager Sy
  • 从 x,y 屏幕空间坐标查找 2D 等距网格上的列、行(将方程转换为函数)

    我试图在屏幕空间点 x y 的二维等距网格中找到行 列 现在我几乎知道我需要做什么 即找到上图中红色向量的长度 然后将其与表示网格边界的向量的长度 由黑色向量表示 进行比较 现在我在数学堆栈交换中寻求帮助 以获得用于计算点 x y 与黑色边
  • 需要在 Android 中伪造正在扫描的 NFC 标签

    好的 我有一个应用程序 此应用程序仅在扫描 NFC 标签 任何标签 时才会完成任务 唯一的问题是 我没有任何 nfc 标签 无论如何 我正试图消除对卡的需要 所以我需要的是一种 伪造 使其看起来 就像已扫描 nfc 标签的方法 我可以编写应
  • 如何使用 git 比较不​​在存储库中的两个文件

    我想比较两个不在任何 git 存储库中的 css 文件 git中有这样的功能吗 git的 diff 比标准 Unix 更实用diff 我经常想这样做 并且由于这个问题在谷歌上排名很高 所以我希望这个答案出现 这个问题 如何使用git dif
  • 如果存储字符串的 char 数组小于字符串,C++ 真正将字符串存储在哪里?

    我正在测试 C Premiere 书中有关 C 字符串的示例 const int size 9 char name1 size char name2 size C owboy 8 characters here cout lt lt How
  • 如何在Python中流式传输和操作大数据文件

    我有一个相对较大 1 GB 的文本文件 我想通过跨类别求和来减小其大小 Geography AgeGroup Gender Race Count County1 1 M 1 12 County1 2 M 1 3 County1 2 M 2
  • MaskedTextBox 的多行掩码

    我有一个MaskedTextBox在我的 Winforms 应用程序中 我需要一个多线掩码 例如 999999 r n 999999 r n 999999 r n 00 00 0000 我读了msdn文档 http msdn microso
  • 限制文本区域中每行的字符数

    我整个周末都在寻找解决这个难题的方法 但尚未找到一个可以正常工作的解决方案 我想要实现的是限制文本区域中每行的字符数 不是相同地限制它们 而是我选择的每行不同的字符数 例如 我只想在我的文本区域中包含 4 行 第 1 2 和 3 行将限制为
  • 使用 Javascript 在 Imacros 中循环

    我如何使用 javascript 循环 imm imacros 脚本 我搜索了一下 发现了这个 for i 0 i lt n i iimPlay marconame iim 但当我使用它时 我的浏览器 Firefox 18 挂起 for i
  • 如何使用 Ghostscript DLL 将 PDF 转换为 PDF/A

    如何使用 GhostScript DLL 将 PDF 转换为 PDF A 我知道我必须调用 gsdll32 dll 的导出函数 其名称为 gsapi init with args 但如何传递正确的参数 顺便说一句 我正在使用 C 请尝试从命
  • 使用表达式获取方法的名称

    我知道网站上有一些关于此问题的答案 如果这有任何重复 我深表歉意 但我发现的所有答案都没有做我想做的事情 我正在尝试指定方法信息 以便我可以通过不使用字符串以类型安全的方式获取名称 所以我试图用一个表达式来提取它 假设我想获取此接口中方法的