Можно ли подразумевать имя параметров массива 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
, который вы передаете в метод. Там вы можете извлечь имя переменной из выражения и выполнить выражение для его значения.