请考虑以下代码:
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]?
之外的任何其他解决方案答案 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