可能重复:
查找传递给C#中函数的变量名称
我想获取变量或参数的名称:
例如,如果我有:
var myInput = "input";
var nameOfVar = GETNAME(myInput); // ==> nameOfVar should be = myInput
void testName([Type?] myInput)
{
var nameOfParam = GETNAME(myInput); // ==> nameOfParam should be = myInput
}
Run Code Online (Sandbox Code Playgroud)
我怎么能在C#中做到这一点?
Nik*_*sev 180
您可以使用它来获取任何提供的成员的名称:
public static class MemberInfoGetting
{
public static string GetMemberName<T>(Expression<Func<T>> memberExpression)
{
MemberExpression expressionBody = (MemberExpression)memberExpression.Body;
return expressionBody.Member.Name;
}
}
Run Code Online (Sandbox Code Playgroud)
获取变量的名称:
string testVariable = "value";
string nameOfTestVariable = MemberInfoGetting.GetMemberName(() => testVariable);
Run Code Online (Sandbox Code Playgroud)
要获取参数的名称:
public class TestClass
{
public void TestMethod(string param1, string param2)
{
string nameOfParam1 = MemberInfoGetting.GetMemberName(() => param1);
}
}
Run Code Online (Sandbox Code Playgroud)
您可以将nameof运算符用于参数,变量和属性等:
string testVariable = "value";
string nameOfTestVariable = nameof(testVariable);
Run Code Online (Sandbox Code Playgroud)
Mar*_*ell 10
你所要传递GETNAME的是值的myInput,而不是定义myInput本身.唯一的方法是使用lambda表达式,例如:
var nameofVar = GETNAME(() => myInput);
Run Code Online (Sandbox Code Playgroud)
确实有可用的例子.然而!这样做是非常错误的.我建议你重新考虑为什么需要这个.几乎肯定不是这样做的好方法,并强制各种开销(捕获类实例和表达式树).此外,它会影响编译器:如果没有这个,编译器可能实际上已经选择完全删除该变量(只使用没有正式本地的堆栈).
或者,
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();
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
您还可以为对象的属性扩展它(可能使用扩展方法):
new { myClass.MyProperty1 }.GETNAME();
Run Code Online (Sandbox Code Playgroud)
您可以缓存属性值以进一步提高性能,因为属性名称在运行时不会更改。
根据我的口味,Expression 方法会比较慢。要一次性获取参数名称和值,请参阅我的这个答案
| 归档时间: |
|
| 查看次数: |
139388 次 |
| 最近记录: |