2009-04-21 94 views
2

我嘗試寫一些代碼將數據從一個對象類型字段轉換蒙上了對象的無符號數類型(來自一個DataSet)到它的目的地(類型)的字段。我在做(至少嘗試)它使用 動態轉換。它似乎適用於字符串,int,DateTime。C#:使用泛型

但它並不適用於無符號類型(ULONG,UINT)工作。下面有一個簡單的代碼,顯示我想要做什麼。如果您將ul var類型從ulong更改爲int,則它可以正常工作。

有沒有人有線索?

public class console 
{ 

    public static void CastIt<T>(object value, out T target) 
    { 
     target = (T) value; 
    } 

    public static void Main() 
    { 
     ulong ul; 
     string str; 
     int i; 
     DateTime dt; 

     object ul_o = (object) 2; 
     object str_o = (object) "This is a string"; 
     object i_o = (object)1; 
     object dt_o = (object) DateTime.Now; 

     Console.WriteLine("Cast"); 

     CastIt(ul_o, out ul); 
     CastIt(str_o, out str); 
     CastIt(i_o, out i); 
     CastIt(dt_o, out dt); 

     Console.WriteLine(ul); 
     Console.WriteLine(str); 
     Console.WriteLine(i); 
     Console.WriteLine(dt.ToString()); 
    } 

} 

回答

12

安德魯說,問題是,你不能從一個盒裝intulong拆箱。

兩個選項:

1)一箱,而不是ulong

object ul_o = (object) 2UL; 

ulong tmp = 2; 
object ul_o = tmp; 

2)請CastIt<T>使用Convert.ChangeType

public static void CastIt<T>(object value, out T target) 
{ 
    target = (T) Convert.ChangeType(value, typeof(T)); 
} 

這有點臭,但適用於您的示例代碼。如果你可以在你的真實代碼中使用第一種方式,那會更好。

0

的CLR不允許你,因爲你的裝箱值類型實際上是一個int投這種方式:

object ul_o = (object)2; 

當你正試圖轉換爲ulong你不能因爲你不能拆箱一個int直接轉換成ulong

+0

我明白了。但是,爲什麼我不能在它是一個uint時轉換它?你認爲有必要在分配結束時加上'u'嗎?如: object o = 10u; 012 Jonathan提出的 ? 乾杯 – Andres 2009-04-21 18:47:23

+1

你必須這樣做,因爲這會給編譯器提示一個推斷ulong而不是int的提示。 – 2009-04-21 18:49:34

3

那是因爲你的ul_o對象是一個int,而不是一個無符號數。當您處於您的投射功能中時,您在投射目標數據的同時投射object。顯式/隱式轉換操作符(這是你需要使用什麼),只有當你有一個類型的實現他們(因爲這些運營商都在編譯時在運行時的靜態連接而不是動態)上下文對象工作。

如果這真的是你想要做什麼,而不是隻直投,使用此:

target = (T)Convert.ChangeType(value, typeof(T)); 
0

我想你想要的是更喜歡(未經測試,但定向改正)...

public static void CastIt<T>(object value) where T : IConvertable 
{ 
    return (T)Convert.ChangeType(value , typeof(T)); 
} 

編輯:挖出由飛碟雙向! :)

0

這是不是一個真正的回答你的問題;只是想提一提,如果你使用的是.NET 3.5中,Linq to DataSets代碼包括像你要實現的功能。具體的擴展方法是DataRow類中的Field < T>()。