[.net C#] 列舉型別的轉型
參考MSDN說明,列舉型別裡預設每個值都是int(從0算起)
http://msdn.microsoft.com/zh-tw/library/sbbt4032.aspx
所以以下的執行過程都是可以通過的
因為在對岸論壇有網友把列舉值儲存在DataRow集合
之後要再從DataRow裡的DataColumn把列舉值取出來
程式碼如下:
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轉型,結果不行?
後來改變寫法,查看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();
}
執行結果:
居然變成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());
}
執行結果:
再測試看看把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型別,那該怎麼轉型為列舉型別呢?
這邊就得用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();
}
執行結果:
========================================================================================================
感謝文章下面網友們的回應:
程式碼經修改後(粗體字部份)
{
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