如何在运行时更改变量名

Posted

技术标签:

【中文标题】如何在运行时更改变量名【英文标题】:How to change variable names in runtime 【发布时间】:2021-12-20 21:07:15 【问题描述】:

我有一个循环,我需要动态创建Entries,然后,我需要在特定的Entry 上创建setFocus(),然后再创建另一个,等等。

如何在运行时更改变量的名称以识别它?

for(i = 0; i < list.Count; i++)

  //the result that I want:
  Entry entry + i = new Entry() Placeholder = "Entry number" + i.ToString() ;


//result
entry1 =  /* Placeholder */ "Entry number 1";
entry2 =  /* Placeholder */ "Entry number 2";
entry3 =  /* Placeholder */ "Entry number 3";

编辑:

我忘了放一个我需要使用的 Entry 事件:

entries[i].Completed += (s, e) =>

   if (!entries[i].Text.Contains("\u00b2"))
   
    entries[i].Text += "\u00b2";
   
;
   entries[i].Focus();

当它进入这个事件时,它不知道我在调用什么条目,总是得到这个数组的最后一个条目。

【问题讨论】:

【参考方案1】:

事件参数中的ssender - 即触发事件的对象

entries[i].Completed += (s, e) =>

   var entry = (Entry)s;

   if (!entry.Text.Contains("\u00b2"))
   
     entry.Text += "\u00b2";
   
;

【讨论】:

【参考方案2】:

你会使用某种集合,例如一个数组:

var entries = new Entry[3];
for(i = 0; i < list.Count; i++)

  //the result that I want:
  entries[i] = new Entry() Placeholder = "Entry number" + i.ToString() ;


//result
entries[0] =  /* Placeholder */ "Entry number 1";
entries[1] =  /* Placeholder */ "Entry number 2";
entries[2] =  /* Placeholder */ "Entry number 3";

要知道被调用的条目,您可以像 Jason 建议的那样转换 sender 参数,var entry = (Entry)s。或者捕获一个变量:

// for loops require copying of the index to a local variable when capturing. 
var currentIndex = i; 
entries[i].Completed += (s, e) =>

   if (!entries[currentIndex].Text.Contains("\u00b2"))
   
    entries[currentIndex].Text += "\u00b2";
   
;

变量名大多在编译之前就已经存在,所以询问如何在运行时更改它是一个无意义的问题。

【讨论】:

我更新了我的问题,我忘了写几行我正在努力做的事情。你能编辑你的答案并包括我现在问的吗? 好的,可以了!谢谢。【参考方案3】:

当你这样做时

for (int i = 0; i < list.Count; i++)

    entries[i].Completed += (s, e) =>
    
       if (!entries[i].Text.Contains("\u00b2"))
       
          entries[i].Text += "\u00b2";
       
    ;

你“capture”那个事件处理程序中的i变量,而不是它的。这意味着当 Completed 事件最终触发时,它使用最新的已知值“i”。

解决方案是将值复制到一个新变量,在循环内声明:

for (int i = 0; i < list.Count; i++)

    int j = i;
    entries[j].Completed += (s, e) =>
    
       if (!entries[j].Text.Contains("\u00b2"))
       
          entries[j].Text += "\u00b2";
       
    ;

【讨论】:

以上是关于如何在运行时更改变量名的主要内容,如果未能解决你的问题,请参考以下文章

确保核心数据@FetchRequest 变量动态运行需要哪些代码更改(附加代码)?

如何在运行时更改日志级别而不重新启动 Spring Boot 应用程序

构建 React 项目后如何设置节点环境变量(运行时)?

在运行时将更改环境变量应用于应用程序

[CentOS 7系列]变量

如何使用 matlab 编码器在运行时初始化变量?