获取变量或参数的名称[重复]
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 来获取特定变量的名称,除非我有类似的字符串查找匹配提前索引。以上是关于获取变量或参数的名称[重复]的主要内容,如果未能解决你的问题,请参考以下文章