Как получить имя метода вызова и метода выполнения лямбда-выражения - PullRequest
3 голосов
/ 27 мая 2020

У меня есть некоторый исторический код, и мы хотим получить некоторые данные о том, как используются некоторые методы. Я пытаюсь получить доступ к имени вызывающего метода, а также к имени выполняемого метода, используя отражение. Но мне кажется, что я могу получить только имя внешнего метода вызова.

У нас есть исходный метод, который делает что-то вроде этого:

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

        return data;
    }
}

И метод в stati c 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".

Это имеет какое-то отношение к тому, что лямбда-выражение является stati c, или мне здесь не хватает чего-то фундаментального?

1 Ответ

1 голос
/ 27 мая 2020

Выражение, данное в лямбда-выражении, является делегатом, вам нужно будет перейти к его содержимому, чтобы получить фактические сведения о методе. Я предлагаю обновить тип параметра для метода Helper (MeasureExecution) на Expression<Func<T>> вместо Func<T>, так как тип Expression позволит вам легко изучить содержимое Func. Я попробовал образец с приведенным ниже фрагментом, и он сработал, как ожидалось. Я использовал переменную stati c вместо вашего LogDetails, чтобы упростить себе жизнь при двойной проверке того, что отправляется. Выполнено: GetData, Выполнение исходного класса: DataBinder, Выполнение исходного метода: FindData

...