C# 获取在异步方法中调用方法的类的类类型
我使用自定义的C# 获取在异步方法中调用方法的类的类类型,c#,C#,我使用自定义的LogManager类来管理应用程序中的所有日志。我有一个如下所述的函数,可以找到调用方法的类,这样我就可以很容易地检测日志的来源 然而,最近在我的应用程序中实现了一些async方法之后,我遇到了一个问题,即我似乎无法使用此函数从任何async方法中找到调用类。(我似乎只能获得调用方法) 我还尝试在日志参数中包含一个对象,并引用this,然后通过这种方式获得对象的类型,但是我有一些静态方法,这对它们不起作用。而且,我不希望每次我想记录一些东西时都要这样做 有人有更好的解决方案来查找
LogManager
类来管理应用程序中的所有日志。我有一个如下所述的函数,可以找到调用方法的类,这样我就可以很容易地检测日志的来源
然而,最近在我的应用程序中实现了一些async
方法之后,我遇到了一个问题,即我似乎无法使用此函数从任何async
方法中找到调用类。(我似乎只能获得调用方法)
我还尝试在日志参数中包含一个对象,并引用this
,然后通过这种方式获得对象的类型,但是我有一些静态方法,这对它们不起作用。而且,我不希望每次我想记录一些东西时都要这样做
有人有更好的解决方案来查找异步方法调用类的位置吗
查找调用位置的当前函数:
private string GetLocation()
{
string location = "Unknown";
StackTrace stackTrace = new StackTrace();
for (int i = 0; i < stackTrace.FrameCount; i++)
{
StackFrame stackFrame = stackTrace.GetFrame(i);
string foundLocation = stackFrame.GetMethod().DeclaringType.Name;
if (!foundLocation.Contains("Log"))
{
location = foundLocation;
break;
}
}
// Detects if log is comming from async method, detects method instead of classtype however
if (location.StartsWith("<"))
{
string[] temp = location.Split('>');
location = temp[0].Replace("<", "");
}
return location;
}
多亏了JonSkeet的评论,对我处理日志的方式和在日志中找到的信息做了一些改变,我才能够解决我的问题 由于支持格式化的
Log
方法有过多的对象参数,因此我无法通过这种方式传递CallerMemberName
/CallerFilePath
。我通过使Log
方法要求直接传递LogMessage
(并在那里处理格式化),以及在该方法中添加的方法和类来解决这个问题
非常感谢JonSkeet为我指明了正确的方向
记录方法:
#region Log Method
public static async void Log(LogLevel logLevel, string message, [CallerMemberName]string location = "")
{
LogMessage logMessage = new LogMessage(logLevel, message, location);
await AddLogToCollection(logMessage);
}
#region Aditional log methods
// Log With Formating -> doesn't work, cannot add the CallerMemberName after a range of params..
public static void Log(LogLevel logLevel, string message, params object[] args, [CallerMemberName]string location = "")
{
string formatString = String.Format(message, args);
Log(logLevel, formatString, location);
}
#endregion
#endregion
public static async void Log(LogMessage logMessage, [CallerMemberName]string method = "", [CallerFilePath]string path = "")
{
logMessage.SetCaller(method, path);
await AddLogToCollection(logMessage);
}
SetCaller方法:
public void SetCaller(string method, string path)
{
string location = path;
if (location.Contains("\\"))
{
string[] temp = location.Split('\\');
location = temp[temp.Length - 1].Replace(".cs", "");
}
Method = method;
Location = location;
}
你能改用来电者信息属性吗?@JonSkeet我从来都不知道这个,目前正在测试这个,如果有任何结果,我会回来的@JonSkeet我试图实现这个,但是我有一个log方法,它接受字符串格式化的参数,所以我不知道在哪里添加这个参数。上面添加的代码@JonSkeet经过一些搜索,我能够调整我的代码,现在它工作得非常完美!再次感谢:)