获取传递到方法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方法被调用了哪个对象。
正如我所说,也许我的做法不对,所以任何建议都会有所帮助。
我不敢相信我真的在建议这个,因为这个解决方案有多脏…但是,它是一个解决方案。。。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
{
}