获取变量或参数的名称[重复]

Posted

技术标签:

【中文标题】获取变量或参数的名称[重复]【英文标题】:get name of a variable or parameter [duplicate] 【发布时间】:2012-04-05 19:04:50 【问题描述】:

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

例如,如果我有:

var myInput = "input";

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

void testName([Type?] myInput)

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

如何在 C# 中做到这一点?

【问题讨论】:

你的意思是,获取变量的type而不是名称 看看这个答案,这似乎工作:[***.com/questions/716399/… [1]:***.com/questions/716399/… @NeilKnight 根据他的例子,我认为他实际上是指变量的名称。 我认为VB 是可能的。从未尝试过C#。但这是可怕的编程风格! 我无法发布答案,因为这个问题已被(错误地)标记为重复。在 C# 6.0 中,您将能够为此使用 nameof operator:var nameOfVar = nameof(myInput); // nameOfVar == "myInput" 【参考方案1】:

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

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

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

【讨论】:

这对于处理获取变量名非常有用。如何在参数中获取名称?提前致谢 @devn 我已经使用示例代码编辑了我的答案,该示例代码显示了如何使用相同的方法获取参数名称。 这似乎对我不起作用... “无法将类型为 'System.Linq.Expressions.TypedConstantExpression' 的对象转换为类型 'System.Linq.Expressions.MemberExpression'。” 我回答中的这两个例子对我有用。尝试发布一些重复错误的代码。 此答案依赖于 Microsoft C# 编译器的非标准化行为,并且可能会在其他编译器或未来版本下中断。参考我的question和answer的话题。【参考方案2】:

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

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

确实有examples of that available。然而!这有点做错事的味道。我建议你重新考虑为什么你需要这个。这几乎肯定不是一个好方法,并且会产生各种开销(捕获类实例和表达式树)。此外,它会影响编译器:如果没有这个,编译器实际上可能会选择完全删除该变量(仅使用没有正式本地的堆栈)。

【讨论】:

我有一个参数列表。我想将这些值保存在文本文件中。我不想这样做:“abc =”+值但是:GETNAME(变量)+变量。这样会更快、更优雅。 @devn 不,我绝对保证它不会更快。它会明显变慢 - 它需要创建一个捕获实例、创建一个表达式并解析一个表达式。不是更快。优雅是主观的。坦率地说,我认为您在这里使用简单的string.Format 不会出错。是的,我会在字符串中包含变量名,即string.Format("foo=0, bar=1", foo, bar),因为:在方法中它们是实现细节,但在文件中它们是文档格式的一部分,它没有nothing 与当地人的称呼有关。【参考方案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();

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

根据我的口味,Expression 方法会慢一些。要同时获取参数名称和值,请参阅this answer of mine

【讨论】:

其实就是给出变量类型的名字。 第一个例子很糟糕!你可以重写 ToString() 方法并繁荣! @cmxl 这仅适用于匿名类型,一种定制模型,仅用于获取成员名称(变量、字段等)。无论如何,今天应该始终使用nameof() 运算符 我只是想添加一个提示,因为功能不限于匿名类型。 ;) nameof() 岩石 \o/ 不幸的是,如果我有一个由一堆 int 类型的变量组成的数组,我不能使用 nameof 来获取特定变量的名称,除非我有类似的字符串查找匹配提前索引。

以上是关于获取变量或参数的名称[重复]的主要内容,如果未能解决你的问题,请参考以下文章

bash - 压缩多个文件,从变量中获取参数,其中一个在名称中有空格[重复]

获取python函数中的参数名称列表[重复]

获取python函数中的参数名称列表[重复]

获取将参数传递给jquery中当前函数的函数名称[重复]

在 Woocommerce 中获取订单商品名称 [重复]

如何遍历这种数组并获取每个元素的标签或名称[重复]