是否可以使用 nameof 运算符暗示 params 数组的参数名称?
Is it possible to imply the name of the parameters of a params array using the nameof operator?
我想我可以利用新的 c# 6 运算符 nameof 从参数数组隐式构建 key/values 的字典。
例如,考虑以下方法调用:
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}");
}
}
不,那是不可能的。您对使用的变量名称一无所知。此类信息不会传递给被叫方。
你可以这样实现你想要的:
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
,您将其传递给方法。在那里,您可以从表达式中提取变量名并为其值执行表达式。
我想我可以利用新的 c# 6 运算符 nameof 从参数数组隐式构建 key/values 的字典。
例如,考虑以下方法调用:
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}");
}
}
不,那是不可能的。您对使用的变量名称一无所知。此类信息不会传递给被叫方。
你可以这样实现你想要的:
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
,您将其传递给方法。在那里,您可以从表达式中提取变量名并为其值执行表达式。