获取变量或参数的名称

时间:2012-03-21 09:20:20

标签: c#

  

可能重复:
  Finding the Variable Name passed to a Function in C#

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

例如,如果我有:

var myInput = "input";

var nameOfVar = GETNAME(myInput); // ==> nameOfVar should be = myInput

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

我怎样才能在C#中做到?

3 个答案:

答案 0 :(得分:165)

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及更高版本的解决方案

您可以使用nameof运算符来获取参数,变量和属性:

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

答案 1 :(得分:9)

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

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

确实有examples of that available。然而!这种做法非常错误。我建议你重新考虑为什么你需要这个。几乎肯定不是这样做的好方法,并强制各种开销(捕获类实例和表达式树)。此外,它会影响编译器:如果没有这个,编译器可能实际上已选择完全删除该变量(仅使用没有正式本地的堆栈)。

答案 2 :(得分:3)

或者,

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();

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

表达方法对我来说会慢一些。要一次性获取参数名称和值,请参阅this answer of mine