使用引用另一个变量的 nameOf 打印变量的名称?
Printing the name of a variable with nameOf that references another variable?
我有一个 class 的多个实例,我想在一个包含我无法控制的此类 class 的数组中进行跟踪。为此,我创建了一个 List<MyClass>
,然后将其与我无法控制的 MyClass[]
中的每个值进行比较。
然后我使用 C#6.0 运算符 nameOf
打印出 class 引用的名称。令我惊讶的是(现在很明显为什么)当我从 List
检查它时打印 class 引用的名称时,打印循环变量名称而不是 class 引用它引用。
有没有办法打印被另一个变量引用的变量名?
(另外这个问题用什么行话比较合适,我觉得我把它给宰了?)
这是使用 Control
的问题示例
Control x = new Control();
Control y = new Control();
Control z = new Control();
var controlArr = new Control[] { x, y, z };
var controlList = new List<Control>() { x, y, z };
for (int i = 0; i < controlArr.Length; i++)
{
Control anArrControl = controlArr[i];
foreach (var aListControl in controlList)
if (anArrControl == aListControl)
Console.Out.WriteLine("Control[" + i + "]: " + nameof(aListControl));
}
此代码将打印
Control[0]: aListControl
Control[1]: aListControl
Control[2]: aListControl
而不是
Control[0]: x
Control[1]: y
Control[2]: z
编辑: 这个例子很简单,因为如果 Control[]
不包含 List<Control>
中的引用,则不会打印任何内容。在我的实际应用程序中,我会处理这个问题。我只是简单地放了示例代码来演示我问问题的意思,我感觉好像措辞不正确。
在 MSDN 上,您找到了激发创建 nameof 函数的用例参考。引用的名称未在编译时定义。鉴于
var a = new object();
var b = a;
var array = new [] {a, b}
nameof(array[1])
return 应该怎么办?它是相同的引用对象。
因此您必须考虑另一种解决方法来实现您的目标。也许字典可能对您有所帮助。喜欢
Control x = new Control();
Control y = new Control();
Control z = new Control();
var references = new Dictionary<Control, string> {
{ x, "x" }, { y, "y" }, {z, "z"}
};
var controlArr = new Control[] { x, y, z };
var controlList = new List<Control>() { x, y, z };
for (int i = 0; i < controlArr.Length; i++)
{
Control anArrControl = controlArr[i];
foreach (var aListControl in controlList)
if (anArrControl == aListControl)
Console.Out.WriteLine("Control[" + i + "]: " + references[aListControl]);
}
不,那行不通,因为 controlList 不包含 x、y 和 z - 它包含 x、y 和 z 在分配时引用的控件。
您可能要考虑两种备选方案:
将控件及其变量名存储在List<Tuple<Control, String>>
:
var controlList = new[] {
Tuple.Create(x, nameof(x)),
Tuple.Create(y, nameof(y)),
Tuple.Create(z, nameof(z))
}.ToList();
显然,您的比较需要更改为 anArrControl == aListControl.Item1
。
一些类(例如WinForm's Control
)有一个Name
属性。也许这个名字也适合你的目的?
我有一个 class 的多个实例,我想在一个包含我无法控制的此类 class 的数组中进行跟踪。为此,我创建了一个 List<MyClass>
,然后将其与我无法控制的 MyClass[]
中的每个值进行比较。
然后我使用 C#6.0 运算符 nameOf
打印出 class 引用的名称。令我惊讶的是(现在很明显为什么)当我从 List
检查它时打印 class 引用的名称时,打印循环变量名称而不是 class 引用它引用。
有没有办法打印被另一个变量引用的变量名?
(另外这个问题用什么行话比较合适,我觉得我把它给宰了?)
这是使用 Control
Control x = new Control();
Control y = new Control();
Control z = new Control();
var controlArr = new Control[] { x, y, z };
var controlList = new List<Control>() { x, y, z };
for (int i = 0; i < controlArr.Length; i++)
{
Control anArrControl = controlArr[i];
foreach (var aListControl in controlList)
if (anArrControl == aListControl)
Console.Out.WriteLine("Control[" + i + "]: " + nameof(aListControl));
}
此代码将打印
Control[0]: aListControl
Control[1]: aListControl
Control[2]: aListControl
而不是
Control[0]: x
Control[1]: y
Control[2]: z
编辑: 这个例子很简单,因为如果 Control[]
不包含 List<Control>
中的引用,则不会打印任何内容。在我的实际应用程序中,我会处理这个问题。我只是简单地放了示例代码来演示我问问题的意思,我感觉好像措辞不正确。
在 MSDN 上,您找到了激发创建 nameof 函数的用例参考。引用的名称未在编译时定义。鉴于
var a = new object();
var b = a;
var array = new [] {a, b}
nameof(array[1])
return 应该怎么办?它是相同的引用对象。
因此您必须考虑另一种解决方法来实现您的目标。也许字典可能对您有所帮助。喜欢
Control x = new Control();
Control y = new Control();
Control z = new Control();
var references = new Dictionary<Control, string> {
{ x, "x" }, { y, "y" }, {z, "z"}
};
var controlArr = new Control[] { x, y, z };
var controlList = new List<Control>() { x, y, z };
for (int i = 0; i < controlArr.Length; i++)
{
Control anArrControl = controlArr[i];
foreach (var aListControl in controlList)
if (anArrControl == aListControl)
Console.Out.WriteLine("Control[" + i + "]: " + references[aListControl]);
}
不,那行不通,因为 controlList 不包含 x、y 和 z - 它包含 x、y 和 z 在分配时引用的控件。
您可能要考虑两种备选方案:
将控件及其变量名存储在
List<Tuple<Control, String>>
:var controlList = new[] { Tuple.Create(x, nameof(x)), Tuple.Create(y, nameof(y)), Tuple.Create(z, nameof(z)) }.ToList();
显然,您的比较需要更改为
anArrControl == aListControl.Item1
。一些类(例如WinForm's
Control
)有一个Name
属性。也许这个名字也适合你的目的?