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经过一些搜索,我能够调整我的代码,现在它工作得非常完美!再次感谢:)