使用nameof获取当前方法的名称

时间:2016-06-29 11:52:14

标签: c# reflection c#-6.0 nameof

浏览,搜索和希望但找不到直接答案。

无论如何在C#6.0中使用nameof获取当前方法名称而不指定方法名称?

我将测试结果添加到这样的字典中:

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

我希望如果我不必明确指定方法名称,那么我可以复制+粘贴该行,这是一个非工作的例子:

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

如果可能,我不想使用反射。

更新

这不是(如建议的)this question的副本。我问是否可以明确地使用nameof而不用(!)反射来获取当前的方法名称。

4 个答案:

答案 0 :(得分:70)

您无法使用nameof来实现这一目标,但这种解决方法如何:

以下不使用直接反射(就像nameof)而没有明确的方法名称。

Results.Add(GetCaller(), result);

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

GetCaller返回调用它的任何方法的名称。

答案 1 :(得分:4)

建立在user3185569的最佳答案之上:

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

您可以在任何地方调用this.GetMethodName()以返回完全限定的方法名称。

答案 2 :(得分:0)

与其他相同,但有所不同:

    /// <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()}...");

答案 3 :(得分:-1)

如果要将当前方法的名称添加到结果列表中,则可以使用:

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);