2012-03-22 78 views
3

我试图获取在C#中使用变量的挂起,但遇到了障碍。以下不起作用。C#:通过变量引用类

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

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

如何在C#中执行此操作?

回答

3

这不是做这个正确的方法,它看起来像有您遇到麻烦两个主要概念,并了解它们将帮助你正确地做到这一点。

首先,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); 
+0

感谢您的真实详细的回复!但是,我的编译器给我的错误:'名称'颜色'不存在于当前上下文中,我猜是库问题。包括?到目前为止,我有:'使用系统;使用System.Collections.Generic;使用System.Linq;使用System.Text;'编辑:对不起,换行符在注释中不起作用 – Scott 2012-03-22 18:02:02

+0

您可以在'System.Drawing'命名空间 – yoozer8 2012-03-22 18:06:31

+0

它说'在System namespac中找不到绘图,你是否缺少程序集引用?'。这是一个控制台应用程序,所以我会假定缺省情况下不包含图形库。 – Scott 2012-03-22 18:08:27

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

ConsoleColor是一个枚举。您必须投下s

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

这是因为ConsoleColor是一个枚举,尝试

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

你应该像这样

ConsoleColor colorValue; 
if (Enum.TryParse(s, out colorValue)) 
{   
    Console.BackgroundColor = colorValue; 
} 
考虑处理,如果字符串是无效的(例如,S = “船”)
2
ConsoleColor colour; 
if (ConsoleColor.TryParse(s, out colour)) 
{ 
    Console.BackgroundColor = colour; 
} 
+1

我几乎downvoted本以为它甚至不会编译,但它的工作,所以我会给予好评。起初我以为“ConsoleColor'枚举上没有'TryParse'方法,但实际上有。由于'ConsoleColor'的基类是'Enum',所以可以通过基类或子类调用静态的'Enum.TryParse'方法。这可能是一种令人困惑的方式来调用该方法(反正它让我失望),但它确实有效。无论谁回答这个问题,都应该自己尝试一下代码。 – BACON 2012-03-22 18:06:53

+0

由于相同的原因,我投下了赞成票。而且也试过了。现在它被锁定了。抱歉。如果答案被编辑并且我解锁了,我会改变它。 :( – 2012-03-22 18:16:07

1

只要添加到其他人使用的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; 
}