【问题标题】:Compare variable name to a string将变量名与字符串进行比较
【发布时间】:2014-01-28 23:36:18
【问题描述】:

我正在使用 Visual Studio 2013 和 C#

我希望能够将字符串变量的名称与我创建的字符串进行比较。

字符串变量名为 print1(例如)

public string print1;

然后我创建一个这样的字符串:

foreach (int number in orderOfNumber)
{
    string printNumber = String.Format("print{0}", number-1);
}

如果 'number' = 1,我会丢弃它,所以我不关心数字是否为 0

我想做的是在 MessageBox 中用几行打印一个字符串。 一行将有点击屏幕上的两张图片之间的时间。 基本格式如下:

//耗时:

1 和 2 -> 1.234 秒

到目前为止,我所拥有的是:

orderBuilder.Append(String.Format("{0} and {1}\t\t", orderOfNumber[number-1], orderOfPicturesNumber[number])).Append("" + printNumber + "\n");

无论我如何尝试,我总是以

1 和 2 打印1

这接近我想要的值,因为 print1 的值实际上是 1.234

有没有办法用原始变量 print1 替换“字符串”print1?

【问题讨论】:

  • 解释原始任务。您正在尝试做的事情看起来像是一个糟糕的设计决定。
  • 改为创建数组,不要使用多个变量..
  • 为什么没有string[] prints(或其他collection)?然后您可以通过prints[number] 获得预期值,而无需担心“print1”、“print2”、..“printN”变量。
  • @user2864740 这是一个非常简单而天才的想法。我不敢相信我没有想到这一点。这将使获得正确值变得容易得多。
  • @zerkms 我同意,这看起来确实是一个糟糕的设计决定。主要是因为它。这只是让“操作员”知道每次点击之间需要多长时间的一种方式。数据也被添加到文本文件中,以便“操作员”稍后可以查看。这只是一个请求的好东西。

标签: c# string stringbuilder string.format


【解决方案1】:

我会创建一个值数组:

public string[] prints;

当然,你必须用你想要保存的值的数量来初始化它:

prints = new string[5]; // Holds five strings

然后,您可以像这样循环它们:

foreach (var number in prints) // Loop through each string in prints
{
    string printNumber = String.Format("print{0}", number);
}

如果您希望能够为prints 动态添加或删除字符串,您可能应该使用List<string> 而不是string[]

【讨论】:

  • 啊。支持@user2864740 所说的代码。这正是我所追求的方法。你得到了接受的答案,因为你实际上把它写成一个答案。
  • 我认为我的评论在技术上也是第一位的 :)
【解决方案2】:

尝试使用此代码:

PropertyInfo pi = this.GetType().GetProperty(printNumber);
string value = (string)(pi.GetValue(null, null));

您唯一需要做的就是将变量声明为属性。

来源:http://www.karpach.com/Reflection-Property-Value.htm

-- 编辑--

我发现了一个我不知道的方法... GetField 可以返回字段值,因此您无需将变量声明为属性,您可以直接使用它们。

public class SomeClass
{
    public int a0 = 1;
    public int a1 = 2;
    public int a2 = 3;

    public void DoSomething()
    {
        int result = 1;

        for (int index = 0; index < 3; index++)
        {
            string fieldName = "a" + index;

            var field = typeof(SomeClass).GetField(fieldName);
            int fieldValue = (int)field.GetValue(this);

            result *= fieldValue;
        }

        Debug.Assert(result == 6);
    }
}

【讨论】:

  • 这是一个解决方案 .. 但针对不同的问题。
  • 我认为这不是 OP 想要做的。他们想在字符串中构建变量的名称,然后获取该变量的值。据我所知,这是不可能的..
  • @MikeChristensen 确定这是可能的
  • 还有一件事。我倾向于回答人们的问题,而不是帮助他们(因此是问答)。另一件事是,如果他/她寻求建议,那么我会告诉他们这不是做事的最佳方式。您不知道问题背后的真正问题是什么,也许他/她想构建一些脚本引擎或诸如此类的东西。
  • @MikeChristensen public string print1; 是一个字段,而不是一个变量。我不是通灵者。
猜你喜欢
  • 2018-03-17
  • 1970-01-01
  • 2015-10-03
  • 2018-09-17
  • 2015-11-21
  • 2015-08-14
  • 2018-05-01
  • 1970-01-01
相关资源
最近更新 更多