Привязка имен методов декларативно? - PullRequest
2 голосов
/ 11 февраля 2011

Обнаружение необходимости иметь возможность получать имена методов декларативным образом (для AOP, отражения и т. Д.), Чтобы проверка компилятором приводила к прерыванию изменений и т. Д.способ сделать это, как с лямбда / общий метод, поэтому мне не нужно помещать имя метода в виде строкового литерала?Я использовал подобные вещи раньше, чтобы получить имена свойств:

    public static string GetPropertyName<T, P>(Expression<Func<T, P>> propSelector)
        where T : class
    {
        return (propSelector.Body as MemberExpression).Member.Name;
    }

.. но есть ли надежный и простой способ сделать то же самое для методов?

1 Ответ

0 голосов
/ 11 февраля 2011

Вы можете сделать что-то подобное с делегатами:

public static string MethodName(Delegate d) {
    return d.Method.Name;
}

// and to use...
MethodName(new Func<object, int>(Convert.ToInt32));

Если вы используете конкретную подпись делегата, вы можете создать определенные перегрузки:

public static string MethodName(Func<object, int> d) {
    return MethodName((Delegate)d);
}

MethodName(Convert.ToInt32);

Вы также можете сделать что-то с дженериками, если у вас есть игра с этим.

...