【问题标题】:C#: Referencing Classes by a VariableC#:通过变量引用类
【发布时间】:2012-03-22 17:43:20
【问题描述】:

我正在尝试在 C# 中使用变量,但遇到了障碍。以下不起作用。

public static void SetBG(string s)
{
    Console.BackgroundColor = ConsoleColor.s;
}

一个非常简单的方法,应该根据程序员通过s 变量发送的内容来设置控制台的背景颜色。如果我使用SetBG("Red");,它应该会通过,但它不会。这是因为System.ConsoleColor' does not contain a definition for 's'

如何在 C# 中做到这一点?

【问题讨论】:

    标签: c# variables syntax


    【解决方案1】:

    这不是执行此操作的正确方法,您似乎遇到了两个主要概念,理解它们将帮助您正确执行此操作。

    首先,s 是您当前班级中的一个变量。 ConsoleColor.s 将引用 ConsoleColor 类中的 s 变量(它没有变量,因此您的错误)。这称为scopeencapsulation,允许我们重用常用词/名称而不会发生冲突。

    其次,您的代码将在运行之前进行编译,ConsoleColor.s(假设有这样的事情)将不再说ConsoleColor.s。相反,它将指向内存中存储代表“s”的值的位置。传递给您的方法的s 将是一个字符串,例如“Red”或“Blue”。这样的字符串和内存中的插槽之间没有任何联系,以便不同的对象存储它的值。

    要做你想做的事,你需要取颜色的名字并将它翻译成一种颜色。一种方法是使用一系列 if/else 语句检查字符串的内容,如果匹配颜色名称,则分配适当的颜色。
    幸运的是,有一种更简单的方法。您可以简单地将字符串解析为ConsoleColor!

    按照the example from MSDN,您可以这样做:

    Console.BackgroundColor = (ConsoleColor) Enum.Parse(typeof(ConsoleColor), s);
    

    【讨论】:

    • 感谢非常详细的回复!但是,我的编译器给了我错误:The name 'Color' does not exist in the current context 我猜这是一个库问题。我需要包含哪些库?到目前为止,我有:using System; using System.Collections.Generic; using System.Linq; using System.Text;EDIT:对不起,换行符在 cmets 中不起作用。
    • 你可以在System.Drawing命名空间中找到Color
    • 它说“在系统命名空间中找不到绘图,您是否缺少程序集参考?”。这是一个控制台应用程序,所以我假设默认情况下不包含图形库。
    • 这是一个很好的答案,但您无法从 Color 转换为 ConsoleColor。您能做的最好的事情是调用Color.FromName(s).ToKnownColor() 并尝试将其与ConsoleColor 值匹配......或者,正如其他答案所证明的那样,只需将s 解析为ConsoleColor,您将拥有开始的正确类型。
    【解决方案2】:
    Console.BackgroundColor = (ConsoleColor)Enum.Parse(typeof (ConsoleColor), s);
    

    【讨论】:

      【解决方案3】:

      ConsoleColor 是一个枚举。你必须投 s

      public static void SetBG(string s){
         Console.BackgroundColor = (ConsoleColor) Enum.Parse(typeof(ConsoleColor), s);
      }
      

      【讨论】:

        【解决方案4】:
        ConsoleColor colour;
        if (ConsoleColor.TryParse(s, out colour))
        {
           Console.BackgroundColor = colour;
        }
        

        【讨论】:

        • 我几乎不赞成这个,认为它甚至无法编译,但它确实有效,所以我会赞成。起初我以为“ConsoleColor 枚举上没有定义TryParse 方法!”,但实际上有。由于ConsoleColor的基类是Enum,所以可以通过基类或子类调用静态Enum.TryParse方法。这可能是调用该方法的一种令人困惑的方式(无论如何,它让我感到困惑),但它确实有效。否决这个答案的人应该自己尝试代码。
        • 出于同样的原因,我投了反对票。而且也试过了。现在它被锁定了。对不起。如果答案被编辑并且我被解锁,我会改变它。 :(
        【解决方案5】:

        这是因为ConsoleColor是枚举,试试

         Console.BackgroundColor = (ConsoleColor) Enum.Parse(typeof(ConsoleColor), s);
        

        如果字符串无效(例如 s="Ship"),您应该考虑使用类似这样的方式进行处理

         ConsoleColor colorValue;
         if (Enum.TryParse(s, out colorValue))
         {        
             Console.BackgroundColor = colorValue;
         }
        

        【讨论】:

          【解决方案6】:

          只是为了增加其他人对 Enum.Parse method 的使用,从 .NET 4.0 开始,您可以使用 Enum.TryParse generic method 更好地处理无效值:

          public static void SetBG(string s)
          {
              ConsoleColor color;
          
              if (!Enum.TryParse<ConsoleColor>(s, out color))
                  throw new ArgumentException("s");
          
              Console.BackgroundColor = color;
          }
          

          【讨论】:

            猜你喜欢
            • 2012-03-28
            • 2011-08-11
            • 2012-10-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多