void MyMethod(string something, params object[] parameters)
{
foreach (object parameter in parameters)
{
// Get the name of each passed parameter
}
}
Run Code Online (Sandbox Code Playgroud)
例如,如果我按以下方式调用方法,我想获取名称"myFirstParam"和"anotherParam".
string myFirstParam = "some kind of text";
string anotherParam = 42;
MyMethod("test", myFirstParam, anotherParam);
Run Code Online (Sandbox Code Playgroud)
也许反思就是答案?也许这是不可能的?我知道这个问题的存在,但这个解决方案在这里不起作用.
(请不要回答"这不是一个好主意".这不是我的问题.)
SLa*_*aks 30
这完全不可能.
以下是一些甚至没有意义的案例:
MyMethod("abc", new object[5]);
MyMethod("abc", "def");
MyMethod("abc", var1 + var2);
MyMethod("abc", SomeMethod());
MyMethod("abc", b ? a : c);
MyMethod("abc", new object());
MyMethod("abc", null);
Run Code Online (Sandbox Code Playgroud)
实际上,局部变量名甚至没有编译到程序集中.
以@shingo 的答案为基础。
从 C#10 开始,您可以使用CallerArgumentExpressionAttribute Class获取传递的变量的名称。
这是.NET6:
using System.Runtime.CompilerServices;
void F(object arg1, [CallerArgumentExpression("arg1")] string arg1Exp = "?")
=> Console.WriteLine($"{arg1Exp} => {arg1}");
var var1 = "C#10";
var var2 = "_";
var b = var1.Length > 7;
F(var1);
F(new object[5]);
F("def");
F(var1 + var2);
F(SomeMethod());
F(b ? var1 : var2);
F(new object());
F(null);
F(int.Parse(var1.Substring(2)) switch {
>= 10 => "Supported",
_ => "Not supported"
});
int SomeMethod() => 7 + 8;
Run Code Online (Sandbox Code Playgroud)
输出(看起来很神奇):
var1 => C#10
new object[5] => System.Object[]
"def" => def
var1 + var2 => C#10_
SomeMethod() => 15
b ? var1 : var2 => _
new object() => System.Object
null =>
int.Parse(var1.Substring(2)) switch {
>= 10 => "Supported",
_ => "Not supported"
} => Supported
Run Code Online (Sandbox Code Playgroud)
C# 10 引入了一个新属性CallerArgumentExpressionAttribute。
从参数获取名称params仍然是不可能的,但是如果您有固定数量的参数(如重载方法),那么这是可能的。
void MyMethod(object p0,
[CallerArgumentExpression("p0") string p0exp = "p0")
{
Console.WriteLine(p0exp);
}
void MyMethod(object p0, object p1,
[CallerArgumentExpression("p0") string p0exp = "p0",
[CallerArgumentExpression("p1") string p1exp = "p1")
{
}
Run Code Online (Sandbox Code Playgroud)