首页 > 解决方案 > 如何获取 Lambda 表达式的调用方法名称和执行方法

问题描述

我有一些历史代码,我们想获得一些关于如何使用某些方法的数据。我正在尝试使用反射访问调用方法的名称以及执行方法的名称。但我似乎只能得到外部调用方法的名称。

我们有一个源方法可以执行以下操作:

public class DataBinder
{
    public IEnumerable<object> FindData(string id)
    {
        var data = Helper.MeasureExecution(() => DataHelper.GetData(id), MethodBase.GetCurrentMethod());

        return data;
    }
}

静态Helper类中的一个方法执行如下操作:

public static T MeasureExecution<T>(Func<T> func, MethodBase sourceMethod)
{
    T funcResult;

    funcResult = func();

    try
    {
        var executingMethod = string.Empty;

        if (func.Method!= null)
        {
            executingMethod = func.Method.Name;
        }

        LogDetails($"Method Being Executed: {executingMethod}, Executing Source Class: {sourceMethod.ReflectedType.Name}, Executing Source Method: {sourceMethod.Name});
    }
    catch { }

    return funcResult;
}

我想得到以下"Method Being Executed: GetData, Executing Source Class: DataBinder, Executing Source Method: FindData",但我总是得到"Method Being Executed: FindData, Executing Source Class: DataBinder, Executing Source Method: FindData"

它是否与 lambda 表达式是静态的有关,还是我在这里遗漏了一些基本的东西?

标签: c#.netfunc

解决方案


lambda 中给出的表达式是一个委托,您必须遍历其内容以获取实际的方法详细信息。我建议将 Helper 方法 ( MeasureExecution)的参数类型更新为Expression<Func<T>>而不是Func<T>作为Expression类型,这样您就可以轻松地检查Func. 我确实尝试了以下代码段的示例,它按预期工作。我用一个静态变量代替你LogDetails,让我在仔细检查发送的内容时更轻松。

public static T MeasureExecution<T>(Expression<Func<T>> func, MethodBase sourceMethod)
        {
            T funcResult;

            funcResult = func.Compile()();

            try
            {
                var executingMethod = string.Empty;
                var methodExpression = func.Body as MethodCallExpression;

                if (methodExpression != null)
                {
                    executingMethod = methodExpression.Method != null ? methodExpression.Method.Name : "Cannot find method details";
                }

                MethodInformation = string.Format("Method Being Executed:  {0}, Executing Source Class: {1}, Executing Source Method: {2}", executingMethod, sourceMethod.ReflectedType.Name, sourceMethod.Name);
                }
                catch { }

                return funcResult;
        }

        public static string MethodInformation { get; private set; }

这是我得到的输出 - 正在执行的方法:GetData,执行源类:DataBinder,执行源方法:FindData


推荐阅读