Использование 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);