打印一个变量的名称,其中nameOf引用了另一个变量

本文关键字:变量 其中 nameOf 引用 另一个 打印 一个 | 更新日期: 2023-09-27 18:13:46

我有一个类的多个实例,我想在一个数组中跟踪,该数组包含我不控制的这种类型的类。为此,我创建了一个List<MyClass>,然后将其与我无法控制的MyClass[]中的每个值进行比较。

然后用c# 6.0操作符nameOf打印出类引用的名称。令我惊讶的是(现在很明显了),当我从List检查时打印类引用的名称时,循环变量名称被打印出来,而不是它引用的类引用。

是否有一种方法可以打印由另一个变量引用的变量的名称?

(还有什么合适的术语来表达这个问题,我觉得我像宰了它?)


下面是使用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

EDIT:这个例子很简单,因为如果Control[]不包含List<Control>中的引用,则不会打印任何内容。在我的实际应用中,我会考虑到这一点。我只是用示例代码来演示我问这个问题时的意思,我觉得我的措辞不太恰当。

打印一个变量的名称,其中nameOf引用了另一个变量

在MSDN上,您可以找到激发了nameof函数创建的用例参考。在编译时没有定义引用的名称。鉴于

 var a = new object();
 var b = a;
 var array = new [] {a, b}

nameof(array[1])应该返回什么?它是同一个被引用对象。

因此,你必须考虑另一个解决方法来实现你的目标。也许一本字典会对你有帮助。像

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在赋值时引用的控件。

您可能需要考虑以下两种选择:

  1. 将控件及其变量名存储在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

  2. 一些类(如WinForm的Control)有一个Name属性。也许这个名字也符合你的目的?

相关文章: