获取variables或参数的名称

可能重复:
在C#中查找传递给函数的variables名

我想获得一个variables或参数的名称:

例如,如果我有:

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解决scheme

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

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

获取variables的名称:

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

您可以使用nameof运算符来表示参数,variables和属性:

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

您传递给GETNAMEGETNAME ,而不是myInput本身的定义。 唯一的方法就是使用lambdaexpression式,例如:

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

确实有这样的例子 。 然而! 这种做法很不对劲。 我会build议你重新考虑你为什么需要这个。 这几乎肯定不是一个好的方法,并强制各种开销(捕获类实例和expression式树)。 此外,它影响编译器:没有这个编译器可能实际上已经select完全删除该variables (只使用没有正式本地的堆栈)。

或者,

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)下面的一个可以更快,虽然(从我的testing)

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

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

expression方式对我的口味来说会变慢。 一起去参数名称和值一起去看我的这个答案