调用者信息,获取传递给方法的变量的名称(如名称)

本文关键字:变量 方法 信息 获取 调用者 | 更新日期: 2023-09-27 18:34:28

public void Test ()
{
    string myString = "hello";
}
public void Method (string text)
{
     COnsole.WriteLine ( ... + " : " + text ); // should print "myString : hello"
}

是否可以获取传递给方法的变量名称?

我想实现这一点:

Ensure.NotNull (instnce); // should throw: throw new ArgumentNullException ("instance");

可能吗?没有来电者信息或类似的东西?

没有操作员名称?

调用者信息,获取传递给方法的变量的名称(如名称)

反射的问题在于,一旦编译了 C# 代码,它将不再具有变量名称。执行此操作的唯一方法是将变量提升为闭包,但是,您将无法像现在这样从函数中调用它,因为它会在函数中输出新的变量名称。这将起作用:

using System;
using System.Linq.Expressions;
public class Program
{
    public static void Main()
    {
        string myString = "My Hello string variable";
        // Prints "myString : My Hello String Variable
        Console.WriteLine("{0} : {1}", GetVariableName(() => myString), myString);
    }
    public static string GetVariableName<T>(Expression<Func<T>> expr)
    {
        var body = (MemberExpression)expr.Body;
        return body.Member.Name;
    }
}

不过,这行不通:

using System;
using System.Linq.Expressions;
public class Program
{
    public static void Main()
    {
        string myString = "test";
        // This will print "myVar : test"
        Method(myString);
    }
    public static void Method(string myVar)
    {
        Console.WriteLine("{0} : {1}", GetVariableName(() => myVar), myVar);
    }
    public static string GetVariableName<T>(Expression<Func<T>> expr)
    {
        var body = (MemberExpression)expr.Body;
        return body.Member.Name;
    }
}