获取变量或参数的名称

oli*_*dev 87 c#

可能重复:
查找传递给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

预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;
    }
}
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)

C#6.0及更高版本的解决方案

您可以将nameof运算符用于参数,变量和属性等:

string testVariable = "value";
string nameOfTestVariable = nameof(testVariable);
Run Code Online (Sandbox Code Playgroud)

  • 此答案依赖于Microsoft C#编译器的非标准化行为,并可能在其他编译器或未来版本下中断.请参阅我的[问题](http://stackoverflow.com/q/11063502/1149773)和[答案](http://stackoverflow.com/a/11071271/1149773). (8认同)

Mar*_*ell 10

你所要传递GETNAME的是myInput,而不是定义myInput本身.唯一的方法是使用lambda表达式,例如:

var nameofVar = GETNAME(() => myInput);
Run Code Online (Sandbox Code Playgroud)

确实有可用的例子.然而!这样做是非常错误的.我建议你重新考虑为什么需要这个.几乎肯定不是这样做的好方法,并强制各种开销(捕获类实例和表达式树).此外,它会影响编译器:如果没有这个,编译器可能实际上已经选择完全删除该变量(只使用没有正式本地的堆栈).

  • @devn不,我绝对保证它不会更快.它将明显变慢 - 它需要创建一个捕获实例,创建一个表达式,并解析一个表达式.不快.优雅是主观的.坦率地说,我不认为你在这里使用简单的`string.Format`会出错.是的,我会在字符串中包含变量名,即`string.Format("foo = {0},bar = {1}",foo,bar)`,因为:在方法中它们是实现细节,但是在文件中它们是文档格式的一部分,它与本地人的调用没什么关系. (5认同)

naw*_*fal 6

或者,

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 方法会比较慢。要一次性获取参数名称和值,请参阅我的这个答案