【问题标题】:Casting a string to a Brush object将字符串投射到 Brush 对象
【发布时间】:2014-02-13 05:12:52
【问题描述】:

我目前有一些像这样的全局变量(全局部分并不真正相关):

public Brush backgroundColor;
public Brush textColor;
public double timeOffset;
public double dateOffset;
public string title;
public bool showTitle;
public bool showText;

我声明了一个新的List<string> 来使用这个来存储所说的变量:

List<string> x = new List<string>();
x.Add(backgroundColor);
x.Add(textColor);
x.Add(timeOffset.ToString());
x.Add(dateOffset.ToString());
x.Add(title);
x.Add(showTitle.ToString());
x.Add(showText.ToString());

值得注意的是,我只是暂时将这些字符串存储到我的列表中。稍后我将使用它们作为对象。如果我想将此列表中的strings 转换为booldouble 之类的类型,我可以简单地使用Convert.ToDouble()Convert.ToBoolean(),但是,我无法为@ 找到任何可以这样做的东西987654331@对象。

我的Brush 对象是这样使用的:Brushes.Black (Reference MSDN)。我看过这个thread,但他们输入的方式是 RGB 或十六进制,这不是我需要的。

编辑:如果没有办法,或者您可以提出更好的使用方法,请告诉我。为什么我需要Brushes.XXXX 是因为我在bitmap 对象上绘制图像。

【问题讨论】:

  • 您不应该将“颜色”存储为画笔。将它们存储为颜色..然后根据它们构建一个画笔。您根本无法使用其他两个画笔的属性创建单个画笔...
  • 您如何使用该列表?你“记得”每个索引中的项目类型是什么吗?
  • 为什么还要将它们存储为字符串?创建一个类作为包装器,或者至少将它们存储在object 的列表中,这将使转换变得非常容易。
  • @DaveZych 是的。这是一个只有七个对象的列表。 @SimonWhitehead 为什么我这样做基本上是因为我有一个方法可以输入Brush,就像这样:public void manualBackgroundColor(Brush backgroundColor) 将事物绘制到graphics 对象上。
  • @theGreenCabbage It's a list of only seven objects - 是的,你只是做错了。

标签: c# brush


【解决方案1】:

如果您需要列表中的属性,我建议您使用List&lt;object&gt;。由于 .NET 中的所有类都派生自 object 类,因此强制转换比将字符串强制转换为对象更具逻辑性。由于您使用的是对象列表,因此不再需要类来保存属性。此外,您可以使用对象初始值设定项来创建列表,而不是每次都调用 Add() 方法。列表的分配将如下所示:

List<object> properties = new List<object>
{
    backgroundColor,
    textColor,
    timeOffset,
    dateOffset,
    title,
    showTitle,
    showText
};

现在您可以将此列表传递给您的方法,如下所示:

YourListExpectingMethod(properties);

在方法中,您必须提供一些逻辑来确定将对象转换为哪种类型!

更多阅读:

【讨论】:

  • 嗨,阿巴斯 - 如果我想访问 properties 中的 backgroundColor,我只需使用 properties.backgroundColor 就可以了吗?我需要在下面指定 getter 或 setter 吗?谢谢!
  • 不,它们在列表中。因此,您可以通过索引器访问它们,如下所示:Brush backgroundColor = (Brush)properties[0];。 Getter 和 setter 用于属性,而属性属于类。列表中的“属性”只是该列表中的项目。
【解决方案2】:

我建议创建一个类来保存所有这些信息:

public class MyDrawingInfo
{
    public Brush BackgroundColor;
    public Brush TextColor;
    public double TimeOffset;
    public double DateOffset;
    public string Title;
    public bool ShowTitle;
    public bool ShowText;
}

现在您可以使用此信息实例化一个类,传递它,而不必到处执行一些疯狂的转换。

编辑:要使用这个类,首先实例化它:

MyDrawingInfo mdi = new MyDrawingInfo();
mdi.BackgroundColor = Brushes.Black;
//etc

然后,当调用另一个方法时,传递你需要的属性:

ManualBackgroundColor(mdi.BackgroundColor)

注意:我更新了属性名称和您的方法名称。在 C# 中,将属性和方法名称设为 Pascal Case

是标准的

【讨论】:

  • 嘿戴夫。我将如何使用它,例如,将backgroundColor 传递给该类之外的方法的输入?
  • 酷,酷。嘿,还有一个问题。无论如何,我都需要通过一个列表来解析我的七个变量,因为这是设置组件的设计(这是上面的变量所在的位置)。它必须通过第 0-6 个索引访问。如何将它们存储到 MyDrawingInfo 类的全局变量中?上面有人建议使用List&lt;object&gt;
  • 我是建议使用这个的人,查看我的答案以获得更详细的解释。 :)