使用 nameof 获取当前方法的名称
Using nameof to get name of current method
已经浏览、搜索并希望找到直接答案。
在 C# 6.0 中是否有在不指定方法名称的情况下使用 nameof
获取当前方法名称?
我正在将我的测试结果添加到这样的字典中:
Results.Add(nameof(Process_AddingTwoConsents_ThreeExpectedRowsAreWrittenToStream), result);
如果我不必明确指定方法名称,我会更愿意,这样我就可以复制并粘贴该行,这是一个无效的示例:
Results.Add(nameof(this.GetExecutingMethod()), result);
如果可能我不想使用反射。
更新
这不是(如建议的那样)this question 的副本。我问是否可以明确地使用 nameof
而无需(!)反射来获取当前方法名称。
如果你想将当前方法的名称添加到结果列表中,那么你可以使用这个:
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);
您不能使用 nameof
来实现这一点,但是这个解决方法怎么样:
下面没有使用直接反射(就像nameof
),也没有显式方法名。
Results.Add(GetCaller(), result);
public static string GetCaller([CallerMemberName] string caller = null)
{
return caller;
}
GetCaller
returns 调用它的任何方法的名称。
基于 user3185569 的出色回答:
public static string GetMethodName(this object type, [CallerMemberName] string caller = null)
{
return type.GetType().FullName + "." + caller;
}
导致您可以在任何地方调用 this.GetMethodName()
以 return 完全限定的方法名称。
与其他人相同,但有所不同:
/// <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()}...");
已经浏览、搜索并希望找到直接答案。
在 C# 6.0 中是否有在不指定方法名称的情况下使用 nameof
获取当前方法名称?
我正在将我的测试结果添加到这样的字典中:
Results.Add(nameof(Process_AddingTwoConsents_ThreeExpectedRowsAreWrittenToStream), result);
如果我不必明确指定方法名称,我会更愿意,这样我就可以复制并粘贴该行,这是一个无效的示例:
Results.Add(nameof(this.GetExecutingMethod()), result);
如果可能我不想使用反射。
更新
这不是(如建议的那样)this question 的副本。我问是否可以明确地使用 nameof
而无需(!)反射来获取当前方法名称。
如果你想将当前方法的名称添加到结果列表中,那么你可以使用这个:
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);
您不能使用 nameof
来实现这一点,但是这个解决方法怎么样:
下面没有使用直接反射(就像nameof
),也没有显式方法名。
Results.Add(GetCaller(), result);
public static string GetCaller([CallerMemberName] string caller = null)
{
return caller;
}
GetCaller
returns 调用它的任何方法的名称。
基于 user3185569 的出色回答:
public static string GetMethodName(this object type, [CallerMemberName] string caller = null)
{
return type.GetType().FullName + "." + caller;
}
导致您可以在任何地方调用 this.GetMethodName()
以 return 完全限定的方法名称。
与其他人相同,但有所不同:
/// <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()}...");