获取传递到方法C#中的变量的声明名称

本文关键字:变量 声明 方法 获取 | 更新日期: 2023-09-27 18:25:35

我之前已经讨论过几次了,我真的不确定这是否是对我来说最好的事情,所以欢迎任何改进建议。

我正试图为我的Selenium测试构建一些详细的日志记录。

我有一个方法调用,它是:

Admin_Login.Username.SetText("MyUsername");

Admin_Login只是一个标准类。然而,"用户名"是一个传递到"SetText"方法中的变量,如下所示:

public static void SetText(this By identifier, string value)
{
    StackTrace stackTrace = new StackTrace();
    string methodName = stackTrace.GetFrame(1).GetMethod().Name;
    string className = stackTrace.GetFrame(1).GetMethod().DeclaringType.FullName;

    //I do some logging here for the manual testers so they can debug after a run
    TestDriver.ResultsLog.LogComment("Class: " + className);
    TestDriver.ResultsLog.LogComment("Calling Method: " + methodName);
    TestDriver.ResultsLog.LogComment("Calling Element: " + identifier.toString());
    IWebElement element = WebDriver.driver.FindElementSafe(identifier);
    ((IJavaScriptExecutor)WebDriver.driver).ExecuteScript("arguments[0].value = arguments[1]", element, value);
}

作为参考,这里是Admin类:

public class Admin_Login
{
    public static By Username = By.Id("ctl00_MainContent_ctlLoginView_ctlLogin_UserName");
}

因此,我可以很好地记录类名和方法名,但我需要找到的是传递到方法中的"标识符"变量的声明名称。

因此,在这种情况下,值应该是"用户名"。

我尝试了一些建议,将Identifier的名称作为"Identifier",但这确实不是我想要的。如果有意义的话,我需要知道SetText方法被调用了哪个对象。

正如我所说,也许我的做法不对,所以任何建议都会有所帮助。

获取传递到方法C#中的变量的声明名称

我不敢相信我真的在建议这个,因为这个解决方案有多脏…但是,它是一个解决方案。。。soooo。。。

class Program
{
    static void Main()
    {
        var foo = new Foo();
        var bar = foo;
        foo.Hit();
        bar.Hit();
    }
}
public static class Extensions
{
    public static void Hit(this Foo foo, [CallerMemberName] string name = null, [CallerFilePath] string path = null, [CallerLineNumber] int lineNumber = -1)
    {
        string callerVariableName;
        using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read))
        {
            StreamReader reader = new StreamReader(stream);
            string csharpFile = reader.ReadToEnd();
            string[] lines = csharpFile.Split(''n');
            string callingLine = lines[lineNumber - 1];
            Match matchVariableName = Regex.Match(callingLine, @"([a-zA-Z]+[^'.]*)'.Hit'(')");
            callerVariableName = matchVariableName.Groups[1].Value;
        }
        Console.WriteLine("'n///////////////////////////////");
        Console.WriteLine("Caller method name:   {0}", name);
        Console.WriteLine("Caller variable name: {0}", callerVariableName);
        Console.WriteLine("File Path:            {0}", path);
        Console.WriteLine("Line number:          {0}", lineNumber);
    }
}
public class Foo
{
}