Если вы можете использовать nameof()
как Jason suggested, тогда перейдите к нему.
Если вы не затем записать этот вспомогательный метод:
class MyClass {
public void SpecialMethod() {
var myName = WhatIsMyName();
}
private static string WhatIsMyName([CallerMemberName] string name= "") {
return name;
}
}
MSDN Посмотреть подробности. Обратите внимание, что если метод вызова перегружен, вы получите его имя, но оно неоднозначно.
Он не поддерживается в старше C# версии (он был представлен в .NET 4.5). Если вам приходится иметь дело с ними, то вам, возможно, придется прибегнуть старый трюк стека ходить, чтобы проверить имя члена, примерно что-то вроде этого:
[MethodImpl(MethodImplOptions.NoInlining)]
private static string WhatIsMyName() {
return new StackTrace().GetFrame(1).GetMethod().Name;
}
(обратите внимание [MethodImpl(MethodImplOptions.NoInlining)]
для предотвращения встраивания, в противном случае, если этот вызов встраиваемые вас» будет пропускать (GetFrame(1)
вместо GetFrame(0)
) их метод, который вы хотите иметь имя.
Имейте в виде, что все эти методы (стек ходьбы, информация о вызывающем абоненте, выражение) на самом деле нужно явно сделать вызов другим способом, где nameof()
- разрешено при компиляции. Это может быть большой разницей в производительности (в случае, если это проблема).
Это звучит просто идеально подходит для использования C# 6 в новом 'nameof' ключевого слова. Стыдно, что он еще не доступен для вас. –