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

时间:2014-10-06 02:01:44

标签: c# selenium reflection

我之前已经多次讨论这个问题了,我不确定这对我来说是否是最好的事情,所以任何改进建议都会受到欢迎。

我正在尝试为我的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");
}

所以我可以很好地记录类名和方法名,但我需要知道的是"标识符"传递给方法的变量。

所以价值应该是"用户名"在这种情况下。

我尝试了一些建议,将标识符的名称作为"标识符"但那真的不是我想要的。我需要知道调用SetText方法的对象,如果有意义的话。

正如我所说,也许我没有采用正确的方式,所以任何建议都会有所帮助。

1 个答案:

答案 0 :(得分:1)

我无法相信我实际上是在暗示这个解决方案有多脏......但是,这是一个解决方案... sooooo ...

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
{
}