获取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方式对我的口味来说会变慢。 一起去参数名称和值一起去看我的这个答案