【问题标题】:How to dynamically access variable by name? [duplicate]如何通过名称动态访问变量? [复制]
【发布时间】:2020-06-15 13:20:24
【问题描述】:

所以我有很多变量,例如 status_CR001、status_CR002、status_CR003。

我想根据 for 循环获取该变量,这是我的代码:

  for (int i = 1; i<5; i++) {
                T_Log_Result.id_log = GetUniqID();
                T_Log_Result.email_user = userID;
                T_Log_Result.bagian = "CR00"+i;
                T_Log_Result.report_status = status_CR00(i);// PROBLEM AT THIS LINE
                T_Log_Result.phase = 1;
                T_Log_Result.schedule = filter + " Mingguan";
                T_Log_Result.date_created = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
                T_Log_Result.date_updated = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
                _context.Add(T_Log_Result);
                await _context.SaveChangesAsync();
            }

所以我不必这样做:

 T_Log_Result.id_log = GetUniqID();
                T_Log_Result.email_user = userID;
                T_Log_Result.bagian = "CR001";
                T_Log_Result.report_status = status_CR001;//THIS LINE
                T_Log_Result.phase = 1;
                T_Log_Result.schedule = filter + " Mingguan";
                T_Log_Result.date_created = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
                T_Log_Result.date_updated = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
                _context.Add(T_Log_Result);
                await _context.SaveChangesAsync();

 T_Log_Result.id_log = GetUniqID();
                T_Log_Result.email_user = userID;
                T_Log_Result.bagian = "CR002";
                T_Log_Result.report_status = status_CR002;//THIS LINE
                T_Log_Result.phase = 1;
                T_Log_Result.schedule = filter + " Mingguan";
                T_Log_Result.date_created = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
                T_Log_Result.date_updated = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
                _context.Add(T_Log_Result);
                await _context.SaveChangesAsync();

在 PHP 上很容易做到这一点,但是 C# 呢?

PHP 代码示例:

 $status_CR001="first";
 $status_CR002="second";
 $status_CR003="third";
 for ($i = 1; $i < 4; $i++) {
  echo ${'status_CR00'.$i};
 }

【问题讨论】:

  • 您可能想要Dictionary&lt;int, string&gt; 或其他东西。
  • 或者使用arrayList 会,问题解决了
  • status_CR001 感觉它应该是一个数组?什么 status_CR001(等);我们能看到它们是在哪里声明的吗?
  • 它不是一个数组,它只是一个我为测试而创建的变量。
  • 使用数组或集合而不是不同的变量。然后您可以使用数组索引进行循环。

标签: c# for-loop variables .net-core


【解决方案1】:

你可以使用反射:

for (int i = 1; i < 5; i++)
{
    // some code ...

    // note that status can be null
    var status = this.GetType()
                     .GetField($"status_CR00{i}",
                               BindingFlags.NonPublic    // use this flag to find private members
                               | BindingFlags.Instance)? // and this one if status_CR00... is non static
                     .GetValue(this);

    // more code ...
}

但是,我强烈建议您使用数组/列表/任何集合来实现这一目标

【讨论】:

  • 字段的所有者(status_cr00)必须是一个类(不是方法)?
  • @AdemAygun 确实
  • @AdemAygun 如果他们在一个方法中,那么他们是“本地人”,而不是“字段”,所以它变成了一个重言式与“字段的所有者”(我将忽略一切与此处的方法重写相关 - 捕获、迭代器、异步、本地函数等)
【解决方案2】:

最小的改变解决方案可能是编写一个映射函数:

    private SomeType GetStatus(int id) => id switch {
        1 => status_CR001,
        2 => status_CR002,
        3 => status_CR003,
        _ => throw new ArgumentException(nameof(id)),
    };

并在您的代码中使用GetStatus(i)

但是,感觉这里更好的解决方案是将它作为一个数组,即 SomeType[] status_CR(请记住,索引是从零开始的,而不是从一开始的,所以你需要status_CR[i - 1])。

【讨论】:

    猜你喜欢
    • 2022-04-26
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 2023-01-09
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多