获取变量或参数的名称

本文关键字:参数 变量 获取 | 更新日期: 2023-09-27 18:28:42

我想获得变量或参数的名称:

例如,如果我有:

var myInput = "input";
var nameOfVar = GETNAME(myInput); // ==> nameOfVar should be = myInput
void testName([Type?] myInput)
{
   var nameOfParam = GETNAME(myInput); // ==> nameOfParam should be = myInput
}

我如何在C#中做到这一点?

获取变量或参数的名称

Pre-C#6.0解决方案

您可以使用它来获取任何提供的成员的名称:

public static class MemberInfoGetting
{
    public static string GetMemberName<T>(Expression<Func<T>> memberExpression)
    {
        MemberExpression expressionBody = (MemberExpression)memberExpression.Body;
        return expressionBody.Member.Name;
    }
}

获取变量名称:

string testVariable = "value";
string nameOfTestVariable = MemberInfoGetting.GetMemberName(() => testVariable);

获取参数名称:

public class TestClass
{
    public void TestMethod(string param1, string param2)
    {
        string nameOfParam1 = MemberInfoGetting.GetMemberName(() => param1);
    }
}

C#6.0及更高版本的解决方案

您可以将运算符的名称用于参数、变量和属性等:

string testVariable = "value";
string nameOfTestVariable = nameof(testVariable);

传递给GETNAME的是myInput,而不是myInput本身的定义。唯一的方法是使用lambda表达式,例如:

var nameofVar = GETNAME(() => myInput);

事实上也有这样的例子。然而这有点做错事的味道。我建议您重新思考为什么您需要这个。几乎可以肯定,这不是一种很好的方法,并且会带来各种开销(捕获类实例和表达式树)。此外,它还会影响编译器:如果没有这一点,编译器实际上可能会选择完全删除该变量(只是使用没有正式本地的堆栈)。

或者,

1) 不接触System.Reflection命名空间,

GETNAME(new { myInput });
public static string GETNAME<T>(T myInput) where T : class
{
    if (myInput == null)
        return string.Empty;
    return myInput.ToString().TrimStart('{').TrimEnd('}').Split('=')[0].Trim();
}

2) 下面的一个可以更快(从我的测试)

GETNAME(new { variable });
public static string GETNAME<T>(T myInput) where T : class
{
    if (myInput == null)
        return string.Empty;
    return typeof(T).GetProperties()[0].Name;
}

您也可以将其扩展到对象的属性(可能使用扩展方法):

new { myClass.MyProperty1 }.GETNAME();

由于属性名称在运行时不会更改,因此可以缓存属性值以进一步提高性能。

根据我的口味,表达方式会更慢。要一次性获得参数名称和值,请参阅我的的答案