查找传递给函数的变量名称
让我用下面的例子来解释我的问题:
public string ExampleFunction(string Variable) {
return something;
}
string WhatIsMyName = "Hello World"';
string Hello = ExampleFunction(WhatIsMyName);
当我将变量“WhatIsMyName”传递给示例函数时,我希望能够获得原始变量名称的字符串。 也许是这样的:
Variable.OriginalName.ToString()
有没有办法做到这一点?
**否**我不这么认为。
您使用的变量名称是为了您的方便和可读性。 如果我没有弄错的话,编译器不需要它,只需将它夹紧即可。
如果有帮助,您可以定义一个名为NamedParameter的新类,其中包含属性Name和Param。 然后您将这个对象作为参数传递。
你想要的是不可能的,但你可以在C#3.0中使用表达式:
public void ExampleFunction(Expression<Func<string, string>> f) {
Console.WriteLine((f.Body as MemberExpression).Member.Name);
}
ExampleFunction(x => WhatIsMyName);
请注意,这依赖于未指定的行为,虽然它在Microsoft的当前C#和VB编译器以及 Mono的C#编译器中都能正常工作,但并不能保证在未来的版本中这不会停止工作。
我知道这是一个老问题,但在C#6.0中,他们引入了应该解决此问题的运算符的名称。 运算符的名称解析了传递给它的变量的名称。
您的案例的用法如下所示:
public string ExampleFunction(string variableName) {
//Construct your log statement using c# 6.0 string interpolation
return $"Error occurred in {variableName}";
}
string WhatIsMyName = "Hello World"';
string Hello = ExampleFunction(nameof(WhatIsMyName));
一个主要的好处是它在编译时完成,
表达的名字是一个常数。 在所有情况下,nameof(...)都会在编译时进行评估以生成一个字符串。 它的参数在运行时不被评估,并被认为是无法访问的代码(但它不会发出“无法访问的代码”警告)。
更多信息可以在这里找到
旧版本的C 3.0及以上版本
建立在Nawfals的答案
GetParameterName2(new { variable });
//Hack to assure compiler warning is generated specifying this method calling conventions
[Obsolete("Note you must use a single parametered AnonymousType When Calling this method")]
public static string GetParameterName<T>(T item) where T : class
{
if (item == null)
return string.Empty;
return typeof(T).GetProperties()[0].Name;
}
链接地址: http://www.djcxy.com/p/69023.html