我希望获得变量或参数的名称:
例如,如果我有:
var myInput = "input";
var nameOfVar = GETNAME(myInput); // ==> nameOfVar should be = myInput
void testName([Type?] myInput)
{
var nameOfParam = GETNAME(myInput); // ==> nameOfParam should be = myInput
}
我该怎么用C#实现这个?
我希望获得变量或参数的名称:
例如,如果我有:
var myInput = "input";
var nameOfVar = GETNAME(myInput); // ==> nameOfVar should be = myInput
void testName([Type?] myInput)
{
var nameOfParam = GETNAME(myInput); // ==> nameOfParam should be = myInput
}
我该怎么用C#实现这个?
你可以使用以下代码获取任何提供的成员的名称:
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);
}
}
您可以使用nameof运算符来获取参数、变量和属性的名称:
string testVariable = "value";
string nameOfTestVariable = nameof(testVariable);
你传递给 GETNAME
的是 myInput
的值,而不是 myInput
本身的定义。唯一的方法是使用 lambda 表达式,例如:
var nameofVar = GETNAME(() => myInput);
实际上,有一些可以作为参考的例子。然而!这种方式很可能是非常错误的。我建议你重新思考为什么需要这样做。它几乎肯定不是一个好方法,并会引入各种开销(捕获类实例和表达式树)。此外,它还会影响编译器:如果没有这个,编译器实际上可能会选择完全删除该变量(只使用堆栈而没有正式本地变量)。
string.Format
就足够了,我建议在字符串中包含变量名,例如:string.Format("foo={0}, bar={1}", foo, bar)
,因为:在该方法中,它们是实现细节,但在文件中它们是文档格式的一部分,与本地变量的名称无关。 - Marc Gravell或者,
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();
您可以缓存属性值以进一步提高性能,因为属性名称在运行时不会更改。
对我来说,表达式方法会比较慢。要在一次操作中获取参数名称和值,请参见我的这个答案
nameof()
运算符。 - nawfalnameof()
真棒 \o/ - cmxl
类型
而不是名称吗? - Neil KnightVB
中是可能的。但我从未在C#
中尝试过。不过,这种编程风格太糟糕了! - juergen dnameof
运算符来实现:var nameOfVar = nameof(myInput); // nameOfVar == "myInput"
。 - Paolo Moretti