c# - 如何获取 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 表达式是静态的有关,还是我在这里遗漏了一些基本的东西?
解决方案
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
推荐阅读
- css - Switch toggle css 看起来像一个复选框
- python - Python3:将任意日期转换为星期几
- typescript - 如何使用编译器 API 将 Typescript 转换为 Typescript?
- javascript - 以“delete”为属性解构对象
- sql - 如何创建两个 JOIN 表以便我可以比较其中的属性?
- python - 我收到在 GET 请求中传递的标头变量的属性错误
- typescript - 我可以使对象属性类型依赖于另一种属性类型吗?
- automated-tests - 是否可以将“ERROR No tests to run”变成警告?
- javascript - 将 v-model 与对象一起使用是否不好,尤其是通过 VueJS 中的几个嵌套组件?
- android - 如何在 Arraylist 数据中检索 Firebase json ArrayList 并将其存储在 Arraylist 中以便稍后在 Textview 中显示