c# - 是否有可能获得一个 Action 中的语句数量或确定它是否有空体?

标签 c# .net vb.net action func

假设我们有这段代码:

Action<int> gf = k => { };
Action<int> gfa = k => { k++; };

如何确定 gf 没有正文或语句?
是否可以获取 Action 中的语句数?

类似于 GetNumberOfStatements(gf) 应该返回 0
或者也许 HasEmptyBody(gf) 应该 返回 true

最佳答案

好吧,这有点不确定,但您可以检查方法体的 IL 并检查它是否为空或完全由 Nops 组成。 (当然最后的 Ret 除外)。

显然,如果编写该方法的编程语言的编译器已编译掉操作而没有任何影响,那么您将在此处得到误报。但我假设您主要对 (arg1, arg2, ... ) => { } C# 案例感兴趣,这应该可以正常工作。

public static bool IsEmpty(this Delegate del)
{
    // Null arg-checking omitted.

    short nop = System.Reflection.Emit.OpCodes.Nop.Value;

    var ilArray = del.Method.GetMethodBody().GetILAsByteArray();

    return ilArray.Take(ilArray.Length - 1).All(b => b == nop);
}

关于c# - 是否有可能获得一个 Action 中的语句数量或确定它是否有空体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15813579/

相关文章:

c# - WMI Win32_NetworkAdapterConfiguration 和 SetDNSSuffixSearchOrder 方法

c# - 如何在 C# 中执行 Convert.ToDateTime 或解析日期,但在 C# 2.0 中仅获取 dd/mm/yyyy?

c# - 为什么要使用 String.Format?

.net - WPF 中 Calendar 和 Datepicker 控件之间的区别?

vb.net - 使用带有 MLLP 的 VB.NET 发送 HL7

c# - 奇怪的 'MySqlSiteMapProvider' 错误虽然正在使用 'XmlSiteMapProvider'

c# - 将分层数据模型绑定(bind)到 DataGrid

c# - IHostedService/BackgroundService 按计划运行(与 Task.Delay 相反)

c# - 为什么我不能在 C# 中使用抽象静态方法?

.net - 在 _layouts 下从 ASP.NET 运行 STSADM