获取传递给C#方法的参数的名称

Nie*_*nch 14 c#

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)

实际上,局部变量名甚至没有编译到程序集中.

  • @Richard:不; 这不是反思的作用.你需要一个反编译器和一个符号文件. (3认同)

tym*_*tam 8

以@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)


shi*_*ngo 6

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)