如何查找执行函数的对象类型和名称?

时间:2014-03-26 12:27:08

标签: c# .net logging reflection clr

请考虑以下代码:

class A
{
    public void Foo()
    {
        string thisFunction = // get the name of the executing function (Foo)
        string thisType = // get the name of the object type (A)
        Log.PrintLog(thisFunction, thisType);
    }
}

public static class Log
{
    public static void PrintLog(string function, string type)
    {
        Console.WriteLine("Call from function {0}, type {1}", function, type);
    }
}

如何找到执行函数和对象类型的名称? 除了使用[CallerFilePath]和[CallerMemberName]?

之外的任何其他解决方案

5 个答案:

答案 0 :(得分:3)

 string thisFunction = Reflection.MethodBase.GetCurrentMethod().Name; 
 string thisType = this.GetType().Name;

答案 1 :(得分:2)

Int .Net4.5你有CallerMemberNameAttribute

  

允许您获取调用者的方法或属性名称   方法

您也可以尝试:

new StackFrame(1).GetMethod().Name;

另请查看这个有趣的链接答案: - Can you use reflection to find the name of the currently executing method?

答案 2 :(得分:1)

如果您可以使用路径而不是类型名称:

class A
{
    public void Foo()
    {
        Log.PrintLog();
    }
}

public static class Log
{
    public static void PrintLog([CallerMemberName] string function = null,
                                [CallerFilePath] string path = null)
    {
        Console.WriteLine("Call from function {0}, file {1}", function, path);
    }
}

例如,您可以选择使用GetType()来获取当前类型的方法 - 但这对于静态方法是不可能的。所以你可以使用:

public static void PrintLog(object obj = null,
       [CallerMemberName] string function = null,
       [CallerFilePath] string path = null)
{
    string name = obj == null ? path : obj.GetType().Name;
    Console.WriteLine("Call from function {0}, name {1}", function, name);
}

使用:

Log.PrintLog(this);

答案 3 :(得分:1)

通常,您可以随意创建StackTrace:

StackTrace st = new StackTrace();

然后它只是在StackFrames中循环:

StackFrame[] sf = st.GetFrames();

// in case your PrintLog has overloads or recursions
//  it may appear several times in the stack
string ownName = "PrintLog"; 
MethodInfo curMethod = null;
for(int i = 0; i < sf.Length; i++) {
     curMethod = sf[i].GetMethod();
     if(ownName != curMethod.Name)
         break;
}
Console.WriteLine("Call from function {0}, type {1}", 
                  curMethod.Name, 
                  curMethod.DeclaringType.Name);

您甚至可以识别类和参数(您可以使用MethodInfo对象)

我个人将时间TID调用者类+类型+名称放入我的日志记录上下文中。


据我了解,您希望将函数名称和类型解析为PrintLog函数。那太乱了!

这种方法的美妙之处在于,你不必这样做。您可以在PrintLog方法中检索来电者 的名称和类型。

答案 4 :(得分:0)

正如here所述,您可以使用MethodInfo类查找返回类型为MethodInfo.ReturnType