Можно ли подразумевать имя параметров массива params с помощью оператора name of?

Я подумал, что мог бы использовать новый оператор nameof C# 6 для создания словаря ключей / значений неявно из массива params.

В качестве примера рассмотрим следующий вызов метода:

string myName = "John", myAge = "33", myAddress = "Melbourne";
Test(myName, myAge, myAddress);

Я не уверен, что будет реализация 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}");
    }
}

1 ответ

Решение

Нет, это невозможно. У вас нет никаких знаний об используемых именах переменных. Такая информация не передается вызываемой стороне.

Вы можете достичь того, что вы хотите, как это:

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 });
}

Или используя словарь:

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} });
}

Или используя 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);
}

Другой возможностью было бы использование Expression, который вы передаете в метод. Там вы можете извлечь имя переменной из выражения и выполнить выражение для его значения.

Другие вопросы по тегам