2010-08-02 47 views
49

Tôi đang gặp phải sự cố là làm cách nào để chuyển đổi chuỗi đầu vào như "ĐỎ" thành loại Màu thực tế Color.Red trong C#. Có cách nào tốt để làm điều này?Chuyển chuỗi thành Màu trong C#

Tôi có thể nghĩ đến việc sử dụng câu lệnh chuyển đổi và câu lệnh trường hợp cho từng loại màu nhưng tôi không nghĩ đó là đủ thông minh.

Trả lời

81
Color red = Color.FromName("Red"); 

MSDN không nói một cách này hay cách khác, vì vậy có một cơ hội tốt mà nó là trường hợp nhạy cảm. (UPDATE: Rõ ràng, nó không phải là.)

Theo như tôi có thể nói, ColorTranslator.FromHtml cũng được.

Nếu Color.FromName không thể tìm thấy một trận đấu, nó sẽ trả new Color(0,0,0);

Nếu ColorTranslator.FromHtml không thể tìm thấy một trận đấu, nó ném một ngoại lệ.

UPDATE:

Vì bạn đang sử dụng Microsoft.Xna.Framework.Graphics.Color, điều này được một chút khôn lanh:

using XColor = Microsoft.Xna.Framework.Graphics.Color; 
using CColor = System.Drawing.Color; 

CColor clrColor = CColor.FromName("Red"); 
XColor xColor = new XColor(clrColor.R, clrColor.G, clrColor.B, clrColor.A); 
+0

Hey James, thx cho bình luận của bạn.Sau khi tôi đang phát triển này trong XNA GameStudio, sau khi tôi nhập mã của bạn, chương trình than phiền: Lỗi 1 'Microsoft.Xna.Framework.Graphics.Color' không chứa định nghĩa cho ' FromName 'và không có phương thức mở rộng' FromName 'chấp nhận đối số đầu tiên của loại' Microsoft.Xna.Framework.Graphics.Color 'có thể được tìm thấy (bạn đang thiếu một chỉ thị sử dụng hoặc tham chiếu assembly?) C: \ Users \ Guoguo \ Desktop \ MapWorld2 \ MapWorld \ GameObject.cs 194 27 MapWorld Bạn có lỗi gì không? – Kevin

+3

+1 để đề cập đến hành vi khác nhau khi không tìm thấy kết quả phù hợp. – Davy8

+0

Microsoft.Xna.Framework không phải là không gian tên phù hợp. Sử dụng System.Drawing – StingyJack

16
System.Drawing.Color myColor = System.Drawing.ColorTranslator.FromHtml("Red"); 

(Sử dụng phương pháp của tôi nếu bạn muốn chấp nhận màu sắc HTML kiểu hex.)

-2

Tôi đã sử dụng một cái gì đó như thế này trước đây:

 public static T CreateFromString<T>(string stringToCreateFrom) { 

     T output = Activator.CreateInstance<T>(); 

     if (!output.GetType().IsEnum) 
      throw new IllegalTypeException(); 

     try { 
      output = (T) Enum.Parse(typeof (T), stringToCreateFrom, true); 
     } 
     catch (Exception ex) { 
      string error = "Cannot parse '" + stringToCreateFrom + "' to enum '" + typeof (T).FullName + "'"; 
      _logger.Error(error, ex); 
      throw new IllegalArgumentException(error, ex); 
     } 

     return output; 
    } 
+0

Nó không phải là một enum. –

+0

@Jon Tôi đã bị lẫn lộn với ConsoleColor. Logic tương tự vẫn có thể áp dụng mặc dù ... phải không? Thay vì Enum.Parse() anh ta có thể làm một trường hợp không nhạy cảm so sánh về tên thuộc tính và trả về kết quả. (rõ ràng là loại bỏ kiểm tra IsEnum). – Skyler

+0

Tôi nghĩ rằng việc tìm kiếm tài sản bằng cách phản ánh mỗi lần sẽ là tương đối đau đớn. Tốt hơn, IMO, để xây dựng một từ điển một lần (theo câu trả lời của tôi). –

14

(Sẽ thực sự tuyệt vời nếu bạn đề cập đến loại Color mà bạn muốn bắt đầu với ...)

Một cách đơn giản để làm điều này là chỉ cần xây dựng một từ điển thông qua phản ánh:

public static class Colors 
{ 
    private static readonly Dictionary<string, Color> dictionary = 
     typeof(Color).GetProperties(BindingFlags.Public | 
            BindingFlags.Static) 
        .Where(prop => prop.PropertyType == typeof(Color)) 
        .ToDictionary(prop => prop.Name, 
            prop => (Color) prop.GetValue(null, null))); 

    public static Color FromName(string name) 
    { 
     // Adjust behaviour for lookup failure etc 
     return dictionary[name]; 
    } 
} 

Đó sẽ là tương đối chậm cho việc tra cứu đầu tiên (trong khi nó sử dụng phản ánh để tìm tất cả các thuộc tính) nhưng nên rất nhanh chóng sau đó.

Nếu bạn muốn phân biệt chữ hoa chữ thường, bạn có thể chuyển vào một số thứ như StringComparer.OrdinalIgnoreCase làm đối số bổ sung trong cuộc gọi ToDictionary. Bạn có thể dễ dàng thêm TryParse v.v. nếu bạn muốn.

Tất nhiên, nếu bạn chỉ cần điều này ở một nơi, không bận tâm với một lớp riêng biệt vv :) ​​

+0

Có vẻ như đây là cách tốt nhất để trả lời ngược lại câu hỏi này: http://stackoverflow.com/questions/3392030/convert-a-xna-color-object-to-a-string –

7

Kể từ khi OP đề cập trong một chú thích rằng ông đang sử dụng Microsoft.Xna.Framework.Graphics.Color hơn System.Drawing.Color lần đầu tiên bạn có thể tạo một System.Drawing.Color sau đó chuyển nó sang một Microsoft.Xna.Framework.Graphics.Color

public static Color FromName(string colorName) 
{ 
    System.Drawing.Color systemColor = System.Drawing.Color.FromName(colorName); 
    return new Color(systemColor.R, systemColor.G, systemColor.B, systemColor.A); //Here Color is Microsoft.Xna.Framework.Graphics.Color 
} 
+0

Dòng thứ hai nên là: Màu xnaColor = new Color (systemColor.R, systemColor.G, systemColor.B, systemColor.A); Nhưng tôi tin đây là cách đơn giản nhất để hoàn thành những gì Robert hỏi. – Romias

+0

@Romias cảm ơn, đã sửa. – Davy8

+0

... và câu lệnh 'return' thích hợp cũng nên được thêm vào quá :) –

3

này làm việc độc đáo cho nhu cầu của tôi;) Hy vọng ai đó có thể sử dụng nó ....

public static Color FromName(String name) 
    { 
     var color_props= typeof(Colors).GetProperties(); 
     foreach (var c in color_props) 
      if (name.Equals(c.Name, StringComparison.OrdinalIgnoreCase)) 
       return (Color)c.GetValue(new Color(), null); 
     return Colors.Transparent; 
    } 
3

Đối với chuyển màu qua xml-strings Tôi đã phát hiện ra:

Color x = Color.Red; // for example 
String s = x.ToArgb().ToString() 
... to/from xml ... 
Int32 argb = Convert.ToInt32(s); 
Color red = Color.FromArgb(argb); 
2

Cách đơn giản nhất:

string input = null; 
Color color = Color.White; 

TextBoxText_Changed(object sender, EventsArgs e) 
{ 
    input = TextBox.Text; 
} 

Button_Click(object sender, EventsArgs e) 
{ 
    color = Color.FromName(input) 
} 
5

Nó phụ thuộc vào những gì bạn đang tìm kiếm, nếu bạn cần System.Windows.Media.Color (như trong WPF) nó rất dễ dàng:

System.Windows.Media.Color color = (Color)System.Windows.Media.ColorConverter.ConvertFromString("Red");//or hexadecimal color, e.g. #131A84 
Các vấn đề liên quan