LINQ Можно ли получить имя метода без возвращаемого типа через деревья выражений LINQ? - PullRequest
3 голосов
/ 06 октября 2009

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

Пример: string methodname = GetMethodname (x => x.GetUser ());

---> Результаты: "GetUser"

Ответы [ 2 ]

9 голосов
/ 06 октября 2009

Абсолютно - но вам понадобится подпись метода, подобная этой:

public static string GetMethodName<T>(Expression<Action<T>> action)

(Это означает, что вам нужно будет указать аргумент типа при его вызове, чтобы использовать лямбда-выражение.)

Пример кода:

using System;
using System.Linq.Expressions;

class Test
{
    void Foo()
    {
    }

    static void Main()
    {
        string method = GetMethodName<Test>(x => x.Foo());
        Console.WriteLine(method);
    }

    static string GetMethodName<T>(Expression<Action<T>> action)
    {
        MethodCallExpression methodCall = action.Body as MethodCallExpression;
        if (methodCall == null)
        {
            throw new ArgumentException("Only method calls are supported");
        }
        return methodCall.Method.Name;
    }
}
1 голос
/ 06 октября 2009

Вам понадобится что-то вроде этого метода:

public static string GetMethodName<T>(Expression<Action<T>> expression) {
    if (expression.NodeType != ExpressionType.Lambda || expression.Body.NodeType != ExpressionType.Call)
        return null;
    MethodCallExpression methodCallExp = (MethodCallExpression) expression.Body;
    return methodCallExp.Method.Name;
}

Звоните так: GetMethodName<string>(s => s.ToLower()) вернет "ToLower".

...