获取变量或参数的名称
本文关键字:参数 变量 获取 | 更新日期: 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();
由于属性名称在运行时不会更改,因此可以缓存属性值以进一步提高性能。
根据我的口味,表达方式会更慢。要一次性获得参数名称和值,请参阅我的的答案