是否可以使用nameof运算符暗示params数组的参数名称?

Vev*_*rke 6 c# nameof

我以为我可以利用新的c#6运算符nameof从params数组隐式地构建键/值的字典.

例如,请考虑以下方法调用:

string myName = "John", myAge = "33", myAddress = "Melbourne";
Test(myName, myAge, myAddress);
Run Code Online (Sandbox Code Playgroud)

我不确定是否会有一个Test的实现,它将能够从params数组中暗示元素的名称.

有没有办法在nameof没有反射的情况下使用它?

private static void Test(params string[] values)
{
    List<string> keyValueList = new List<string>();

    //for(int i = 0; i < values.Length; i++)
    foreach(var p in values)
    {
        //"Key" is always "p", obviously
        Console.WriteLine($"Key: {nameof(p)}, Value: {p}");
    }
}
Run Code Online (Sandbox Code Playgroud)

Pat*_*man 4

不,那是不可能的。您对所使用的变量名称一无所知。此类信息不会传递给被调用者。

你可以这样实现你想要的:

private static void Test(params string[][] values)
{
    ...
}

public static void Main(string[] args)
{
    string myName = "John", myAge = "33", myAddress = "Melbourne";
    Test(new string[] { nameof(myName), myName });
}
Run Code Online (Sandbox Code Playgroud)

或者使用字典:

private static void Test(Dictionary<string, string> values)
{
    ...
}

public static void Main(string[] args)
{
    string myName = "John", myAge = "33", myAddress = "Melbourne";
    Test(new Dictionary<string, string> { { nameof(myName), myName }, { nameof(myAge), myAge} });
}
Run Code Online (Sandbox Code Playgroud)

或者使用dynamic

private static void Test(dynamic values)
{
    var dict = ((IDictionary<string, object>)values);
}

public static void Main(string[] args)
{
    dynamic values = new ExpandoObject();
    values.A = "a";
    Test(values);
}
Run Code Online (Sandbox Code Playgroud)

另一种可能性是使用 an Expression,将其传递给该方法。在那里,您可以从表达式中提取变量名称并执行表达式以获得其值。