对象列表上的InvalidCastException

woo*_*gie 2 c# asp.net visual-studio-2010

我有一个查询结果如下

Blue
OrangeRed
Black
Green
Silver
Red
Run Code Online (Sandbox Code Playgroud)

我打算从这个结果集中列出System.Drawing.Color对象.当我运行程序时,我得到了InvalidCastException.所有这些颜色肯定都在Color的枚举中.为什么我得到这个例外?

private List<System.Drawing.Color> BuildColorList()
    {
        List<System.Drawing.Color>ColorList = new List<System.Drawing.Color>();
        using (SqlConnection con = new SqlConnection(cs))
        {
            using (SqlCommand cmd = new SqlCommand("select color from Colors", con))
            {
                con.Open();
                cmd.CommandType = CommandType.Text;
                SqlDataReader rdr = cmd.ExecuteReader();
                while (rdr.Read())
                {
                    System.Drawing.Color color = (System.Drawing.Color)rdr["color"];
                    ColorList.Add(color);
                }
            }
            return ColorList;
        }
    }
Run Code Online (Sandbox Code Playgroud)

das*_*ght 6

你不能做一个强制转换:查询返回一个System.String对象,不能直接强制转换为对象System.Drawing.Color.相反,您需要使用Color.FromName(string)方法:

private List<System.Drawing.Color> BuildColorList()
{
    List<System.Drawing.Color>ColorList = new List<System.Drawing.Color>();
    using (SqlConnection con = new SqlConnection(cs))
    {
        using (SqlCommand cmd = new SqlCommand("select color from Colors", con))
        {
            con.Open();
            cmd.CommandType = CommandType.Text;
            SqlDataReader rdr = cmd.ExecuteReader();
            while (rdr.Read())
            {
                System.Drawing.Color color = System.Drawing.Color.FromName((string)rdr["color"]);
                ColorList.Add(color);
            }
        }
        return ColorList;
    }
}
Run Code Online (Sandbox Code Playgroud)