【问题标题】: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而不是名称
  • @NeilKnight 根据他的例子,我认为他实际上是指变量的名称。
  • 我认为VB 是可能的。从未尝试过C#。但这是可怕的编程风格!
  • 我无法发布答案,因为这个问题已被(错误地)标记为重复。在 C# 6.0 中,您将能够为此使用 nameof operatorvar nameOfVar = nameof(myInput); // nameOfVar == "myInput"

标签: c#


【解决方案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# 编译器的非标准化行为,并且可能会在其他编译器或未来版本下中断。参考我的questionanswer的话题。
【解决方案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 来获取特定变量的名称,除非我有类似的字符串查找匹配提前索引。
猜你喜欢
  • 1970-01-01
  • 2014-07-01
  • 2010-11-03
  • 1970-01-01
  • 2011-11-02
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多