[.net C#] 列舉型別的轉型

[.net C#] 列舉型別的轉型

參考MSDN說明,列舉型別裡預設每個值都是int(從0算起)

http://msdn.microsoft.com/zh-tw/library/sbbt4032.aspx

所以以下的執行過程都是可以通過的

demo

 

因為在對岸論壇有網友把列舉值儲存在DataRow集合

之後要再從DataRow裡的DataColumn把列舉值取出來

把Oject转换成自定义枚举变量抛出异常怎么回事?

程式碼如下:

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication2
{
    class Program
    {
        public enum DirectionET
        {
            Buy,
            Sell
        }

        static void Main(string[] args)
        {
            //这里能够直接把Object强制转换成枚举变量
            DirectionET enum1 = DirectionET.Sell;
            Object obj = enum1;
            DirectionET enum2 = (DirectionET)obj;       //这里可以!!!!


            //建立一个简单的表格,把枚举存进去
            DataTable dt = new DataTable();
            {
                dt.Columns.Add("enum");
                dt.Columns.Add("string");
                DataRow row = dt.NewRow();
                row["enum"] = enum1;
                row["string"] = "a test";
                dt.Rows.Add(row);
            }

            //从表格里把枚举取出来,是Object对象。 然后想把这个Object对象换成枚举变量就不行了
            {
                DataRow row = dt.Rows[0];
                Object enumObj = row["enum"];
                DirectionET enum3 = (DirectionET)enumObj;  //这里提示异常InvalidCastException,为什么不行?????
            }




            Console.ReadKey();
        }
    }
}

 

這邊我嘗試把DataRow裡的值照MSDN說明講的做int轉型,結果不行?

 

 

 

image

後來改變寫法,查看DataRow裡,列舉值到底是什麼?

        {
            //这里能够直接把Object强制转换成枚举变量
            DirectionET enum1 = DirectionET.Sell;
            Object obj = enum1;
            DirectionET enum2 = (DirectionET)obj;       //这里可以!!!!


            //建立一个简单的表格,把枚举存进去
            DataTable dt = new DataTable();
            {
                dt.Columns.Add("enum");
                dt.Columns.Add("string");
                DataRow row = dt.NewRow();
                row["enum"] = enum1;
                row["string"] = "a test";
                dt.Rows.Add(row);
            }

            //从表格里把枚举取出来,是Object对象。 然后想把这个Object对象换成枚举变量就不行了
            {
                DataRow row = dt.Rows[0];
                //Object enumObj = row["enum"];
                //DirectionET enum3 = (DirectionET)enumObj;  //这里提示异常InvalidCastException,为什么不行?????
                Console.WriteLine(row["enum"].GetType().ToString());
            }




            Console.ReadKey();
        }

 

執行結果:

image

居然變成String型別?

再換種寫法把DataTime.Now存入DataRow,物件存入DataRow

DataTable dt = new DataTable();
{
    dt.Columns.Add("enum");
    dt.Columns.Add("string");
    DataRow row = dt.NewRow();
    row["enum"] = DateTime.Now;
    row["string"] = new Program();
    dt.Rows.Add(row);
}

//从表格里把枚举取出来,是Object对象。 然后想把这个Object对象换成枚举变量就不行了
{
    DataRow row = dt.Rows[0];
    //Object enumObj = row["enum"];
    //DirectionET enum3 = (DirectionET)enumObj;  //这里提示异常InvalidCastException,为什么不行?????
    Console.WriteLine(row[0].GetType().ToString());
    Console.WriteLine(row[1].GetType().ToString());
}

執行結果:

image

再測試看看把int、double存入DataRow

DataTable dt = new DataTable();
{
    dt.Columns.Add("enum");
    dt.Columns.Add("string");
    DataRow row = dt.NewRow();
    row["enum"] = 1;
    row["string"] = 0.0;
    dt.Rows.Add(row);
}

//从表格里把枚举取出来,是Object对象。 然后想把这个Object对象换成枚举变量就不行了
{
    DataRow row = dt.Rows[0];
    //Object enumObj = row["enum"];
    //DirectionET enum3 = (DirectionET)enumObj;  //这里提示异常InvalidCastException,为什么不行?????
    Console.WriteLine(row[0].GetType().ToString());
    Console.WriteLine(row[1].GetType().ToString());
}

執行結果仍然還是String

事實證明,不管是參考型別還是實質型別,在存入DataRow之後再取出來,型別都會變成String

回到一開始該網友的發問,既然知道DataRow裡的值變成String型別,那該怎麼轉型為列舉型別呢?

image

這邊就得用Enum.Parse 方法

 

 

        {
            //这里能够直接把Object强制转换成枚举变量
            DirectionET enum1 = DirectionET.Sell;
            Object obj = enum1;
            DirectionET enum2 = (DirectionET)obj;       //这里可以!!!!


            //建立一个简单的表格,把枚举存进去
            DataTable dt = new DataTable();
            {
                dt.Columns.Add("enum");
                dt.Columns.Add("string");
                DataRow row = dt.NewRow();
                row["enum"] = enum1;
                row["string"] = "a test";
                dt.Rows.Add(row);
            }

            //从表格里把枚举取出来,是Object对象。 然后想把这个Object对象换成枚举变量就不行了
            {
                DataRow row = dt.Rows[0];
                Object enumObj = row["enum"];
                //DirectionET enum3 = (DirectionET)enumObj;  //这里提示异常InvalidCastException,为什么不行?????
                DirectionET lastEnum = (DirectionET)Enum.Parse(typeof(DirectionET), enumObj.ToString());
                Console.WriteLine("轉型後再ToString:" + lastEnum.ToString());
            }

            Console.ReadKey();
        }

執行結果:

image

========================================================================================================

感謝文章下面網友們的回應:

程式碼經修改後(粗體字部份)

{
    DirectionET enum1 = DirectionET.Sell;
    Object obj = enum1;
    DirectionET enum2 = (DirectionET)obj;        

    //建立一个简单的表格,把枚举存进去
    DataTable dt = new DataTable();
    {
        dt.Columns.Add("enum",typeof(DirectionET));
        dt.Columns.Add("string");
        DataRow row = dt.NewRow();
        row["enum"] = enum1;
        row["string"] = "a test";
        dt.Rows.Add(row);
    }

    //从表格里把枚举取出来,是Object对象。 然后想把这个Object对象换成枚举变量就不行了
    {
        DataRow row = dt.Rows[0];
        Object enumObj = row["enum"];
        DirectionET enum3 = (DirectionET)enumObj;   
        Console.WriteLine(enum3.ToString());
    }

    Console.ReadKey();
}

 

DataTable一開始加入的DataColumn就先定義好型別,這樣不管存值還是從DataColumn取出來的值,型別都會一致

我若沒發這篇文章當備忘錄讓網友們回應的話,或許還忘了有這招存在XD