Можно ли использовать отражение для нахождения названия в настоящее время метода выполнения?

Вы можете использовать публичный наблюдаемый список для хранения общедоступных данных или просто создать общедоступный метод настройки для хранения данных и получения из соответствующего контроллера

198
задан Joel Coehoorn 1 December 2008 в 15:17
поделиться

7 ответов

185
ответ дан Jonathan Allen 4 November 2019 в 14:45
поделиться

Отрывок, обеспеченный Lex, был немного длинен, таким образом, я указываю на важную часть, так как никто больше не использовал ту же самую технику:

string MethodName = new StackFrame(0).GetMethod().Name;

Это должно возвратить идентичные результаты MethodBase. GetCurrentMethod () техника.Name , но на это все еще стоит указать, потому что я мог реализовать это однажды в его собственном методе с помощью индекса 1 для предыдущий метод и назвать его от многих различных свойств. Кроме того, это только возвращает один кадр скорее тогда все отслеживание стека:

private string GetPropertyName()
{  //.SubString(4) strips the property prefix (get|set) from the name
    return new StackFrame(1).GetMethod().Name.Substring(4);
}

Это - острота, также;)

46
ответ дан Joel Coehoorn 4 November 2019 в 14:45
поделиться

Попробуйте эту внутреннюю часть Основной метод в пустой консольной программе:

MethodBase method = MethodBase.GetCurrentMethod();
Console.WriteLine(method.Name);

Консольный Вывод:
Main

15
ответ дан Lars Mæhlum 4 November 2019 в 14:45
поделиться

Да определенно.

, Если Вы хотите объект управлять, я на самом деле использую функцию как это:

public static T CreateWrapper<T>(Exception innerException, params object[] parameterValues) where T : Exception, new()
{
    if (parameterValues == null)
    {
        parameterValues = new object[0];
    }

    Exception exception   = null;
    StringBuilder builder = new StringBuilder();
    MethodBase method     = new StackFrame(2).GetMethod();
    ParameterInfo[] parameters = method.GetParameters();
    builder.AppendFormat(CultureInfo.InvariantCulture, ExceptionFormat, new object[] { method.DeclaringType.Name, method.Name });
    if ((parameters.Length > 0) || (parameterValues.Length > 0))
    {
        builder.Append(GetParameterList(parameters, parameterValues));
    }

    exception = (Exception)Activator.CreateInstance(typeof(T), new object[] { builder.ToString(), innerException });
    return (T)exception;
}

Эта строка:

MethodBase method     = new StackFrame(2).GetMethod();

Идет по стековому фрейму для нахождения вызывающего метода тогда, мы используем отражение для получения значений информации о параметре, переданных ему для универсальной функции сообщения об ошибке. Для получения существующего метода просто используют текущий стековый фрейм (1) вместо этого.

, Поскольку другие сказали для имени существующих методов, которое можно также использовать:

MethodBase.GetCurrentMethod()

я предпочитаю обходить стек, потому что, если взгляд внутренне, что метод это просто создает StackCrawlMark так или иначе. Обращение к Стеку непосредственно кажется более четким мне

Сообщение 4.5, можно теперь использовать [CallerMemberNameAttribute] в качестве части параметров метода для получения строки имени метода - это может помочь в некоторых сценариях (но действительно в говорят пример выше)

public void Foo ([CallerMemberName] string methodName = null)

, Это, казалось, было главным образом решением для поддержки INotifyPropertyChanged, где ранее у Вас были строки, замусоренные на всем протяжении Вашего кода события.

12
ответ дан Lex 4 November 2019 в 14:45
поделиться

РЕДАКТИРОВАНИЕ: MethodBase является, вероятно, лучшим способом просто получить метод, Вы находитесь в (в противоположность целой стопке вызова). Я был бы все еще обеспокоен встраиванием как бы то ни было.

можно использовать StackTrace в рамках метода:

StackTrace st = new StackTrace(true);

И взгляд на кадры:

// The first frame will be the method you want (However, see caution below)
st.GetFrames();

Однако знать, что, если метод встраивается, Вы не будете в методе, Вы думаете, что Вы. Можно использовать атрибут для предотвращения встраивания:

[MethodImpl(MethodImplOptions.NoInlining)]
9
ответ дан denis phillips 4 November 2019 в 14:45
поделиться

Как насчет этого это:

StackFrame frame = new StackFrame(1);
frame.GetMethod().Name; //Gets the current method name

MethodBase method = frame.GetMethod();
method.DeclaringType.Name //Gets the current class name
4
ответ дан jesal 4 November 2019 в 14:45
поделиться

Я думаю, что необходимо быть в состоянии получить это от создания StackTrace. Или, как edg и упоминание Lars MГ ¦ hlum , MethodBase. GetCurrentMethod ()

2
ответ дан Community 4 November 2019 в 14:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: