Использование nameof для получения имени текущего метода

Просматривал, искал и надеялся, но не могу найти прямой ответ.

Есть ли так или иначе в C# 6.0, чтобы получить текущее имя метода, используя nameof без указания имени метода?

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

Results.Add(nameof(Process_AddingTwoConsents_ThreeExpectedRowsAreWrittenToStream), result);

Я бы предпочел, если бы мне не пришлось явно указывать имя метода, чтобы я мог скопировать + вставить строку, нерабочий пример:

Results.Add(nameof(this.GetExecutingMethod()), result);

Если возможно, я не хочу использовать Reflection.

ОБНОВИТЬ

Это не (как предполагалось) дубликат этого вопроса. Я спрашиваю, возможно ли явно использовать nameof без (!) отражения, чтобы получить текущее имя метода.

3 ответа

Решение

Вы не можете использовать nameof чтобы достичь этого, но как насчет этого обходного пути:

Ниже не используется прямое отражение (так же, как nameof ) и нет явного имени метода.

Results.Add(GetCaller(), result);

public static string GetCaller([CallerMemberName] string caller = null)
{
    return caller;
}

GetCaller возвращает имя любого метода, который его вызывает.

Опираясь на отличный ответ user3185569:

public static string GetMethodName(this object type, [CallerMemberName] string caller = null)
{
    return type.GetType().FullName + "." + caller;
}

В результате вы можете звонить this.GetMethodName() в любом месте, чтобы вернуть полное имя метода.

То же, что и другие, но с некоторыми вариациями:

    /// <summary>
    /// Returns the caller method name.
    /// </summary>
    /// <param name="type"></param>
    /// <param name="caller"></param>
    /// <param name="fullName">if true returns the fully qualified name of the type, including its namespace but not its assembly.</param>
    /// <returns></returns>
    public static string GetMethodName(this object type, [CallerMemberName] string caller = null, bool fullName = false)
    {
        if (type == null) throw new ArgumentNullException(nameof(type));
        var name = fullName ? type.GetType().FullName : type.GetType().Name;
        return $"{name}.{caller}()";
    }

Позволяет называть это так:

Log.Debug($"Enter {this.GetMethodName()}...");

Если вы хотите добавить имя текущего метода в список результатов, вы можете использовать это:

StackTrace sTrace= new StackTrace();
StackFrame sFrame= sTrace.GetFrame(0);
MethodBase currentMethodName = sFrame.GetMethod();
Results.Add(currentMethodName.Name, result);

Или вы можете использовать,

Results.Add(new StackTrace().GetFrame(0).GetMethod().Name, result);    
Другие вопросы по тегам