我想获取变量或参数的名称:

例如,如果我有:

var myInput = "input";

var nameOfVar = GETNAME(myInput); // ==> nameOfVar should be = myInput

void testName([Type?] myInput)
{
   var nameOfParam = GETNAME(myInput); // ==> nameOfParam should be = myInput
}


如何我在C#中执行吗?

评论

您的意思是,获取变量的类型而不是名称

看看这个答案,这似乎可行:[stackoverflow.com/questions/716399/…[1]:stackoverflow.com/questions/716399/…

@NeilKnight我认为根据他的示例,他实际上是指变量的名称。

我认为这在VB中是可能的。从未尝试过使用C#。但这是可怕的编程风格!

我无法发布答案,因为此问题已(错误地)标记为重复。在C#6.0中,您将可以使用nameof运算符:var nameOfVar = nameof(myInput); // nameOfVar ==“ myInput”

#1 楼

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及更高版本的解决方案

您可以对参数,变量和属性使用nameof运算符:

string testVariable = "value";
string nameOfTestVariable = nameof(testVariable);


评论


这对于处理获取变量名非常有用。如何在参数中获取名称?提前致谢

–?olidev
2012年3月21日在9:51

@devn我用示例代码编辑了答案,该示例代码显示了如何使用相同的方法来获取参数名称。

– Nikola Anusev
2012年3月21日在11:08



这似乎对我不起作用... {“无法将类型为'System.Linq.Expressions.TypedConstantExpression'的对象强制转换为类型为'System.Linq.Expressions.MemberExpression'。”}

–weberc2
2012年11月29日19:12

我的答案中的这两个例子对我有用。尝试发布一些重复该错误的代码。

– Nikola Anusev
2012年11月29日20:10

该答案依赖于Microsoft C#编译器的非标准化行为,并且可能在其他编译器或将来的版本下崩溃。请参阅我关于该主题的问答。

–道格拉斯
13年10月3日,21:55

#2 楼

您传递给GETNAME的是myInput的值,而不是myInput本身的定义。唯一的方法是使用lambda表达式,例如:

var nameofVar = GETNAME(() => myInput);


,确实有可用的示例。然而!做某些非常错误的事的后悔。我建议您重新考虑为什么需要这个。几乎可以肯定,这不是一种好方法,并且会增加各种开销(捕获类实例和表达式树)。同样,这也会影响编译器:没有此编译器实际上可能已经选择完全删除该变量(只是使用没有正式本地变量的堆栈)。

评论


我有一个参数列表。我想将这些值保存在文本文件中。我不想这样:“ abc =” +值,但是:GETNAME(variable)+ variable。这样会更快更优雅。

–?olidev
2012年3月21日在9:27

@devn不,我绝对保证它不会更快。这将明显慢一些-它需要创建一个捕获实例,创建一个表达式并解析一个表达式。不快优雅是主观的。坦白地说,我认为使用简单的字符串不会出错,请在此处设置格式。是的,我将在字符串中包含变量名称,即string.Format(“ foo = {0},bar = {1}”,foo,bar),因为:在方法中,它们是实现细节,但是在该文件是文档格式的一部分,与本地语言无关。

– Marc Gravell♦
2012年3月21日在9:30



#3 楼

或者,

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();


可以缓存属性值以进一步提高性能,因为在运行时属性名称不会更改。

我觉得“表达”方法要慢一些。要一次性获得参数名称和值,请参阅我的答案

评论


实际上,它给出了变量类型的名称。

– BladeMight
18年5月21日在19:34

第一个例子很糟糕!您可能已经重写了ToString()方法并开始使用!

– cmxl
18年7月14日在16:09

@cmxl这仅适用于匿名类型,这是仅用于获取成员名称(变量,字段等)的定制模型。无论如何,今天应该始终使用nameof()运算符

– nawfal
18年7月16日在5:05

我只想添加一个提示,因为该功能不仅限于匿名类型。 ;)nameof()岩石\ o /

– cmxl
18年7月16日在7:59