获取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); 
 您传递给GETNAME是GETNAME的值 ,而不是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方式对我的口味来说会变慢。 一起去参数名称和值一起去看我的这个答案