2010-03-22 58 views
2

是否有任何方法將物件取消裝箱的實際類型?取消裝箱對象到其類型

基本上我給出的ArrayList,數組列表實際上的intdouble,也許其他類型的列表(它可以是,但它是要麼全部intdouble,沒有混合)。現在,我將不得不返回List<double>List<int>或其他列表,具體取決於實際類型。

public List<T> ConvertToList<T>(ArrayList arr) 
{ 
    var list1 = new List<T>(); 
    foreach(var obj in arr) 
    { 
    // how to do the conversion? 
    var objT = ?? 
    list1.Add(objT); 
    } 
    return list1; 
} 

有什麼想法嗎?

回答

8

如果您使用.NET 3.5只是普通的類型,有這樣做更簡單的方法:

public List<T> ConvertToList<T>(IEnumerable original) 
{ 
    return original.Cast<T>().ToList(); 
} 

(I」因爲我們沒有在這裏使用任何特定於ArrayList的任何東西,所以將參數概括爲IEnumerable)。

3

您可以使用Convert類。

var objT = (T)Convert.ChangeType(obj, typeof(T)); 
+3

Erhm,返回o bject,這是你首先得到的。你正在做一次轉換2次。 '(T)obj;'就夠了。 – 2010-03-22 08:02:19

+0

@Filip你是對的。但是這個解決方案有點寬容。這樣,如果Convert不失敗,也可以將字符串轉換爲int。 – gsharp 2010-03-22 08:30:07

+2

但這不是被問到的問題。就個人而言,如果我期望一個ArrayList只包含盒裝值,我寧可得到一個異常,如果它開始包含字符串或實際上意外類型的盒裝值。只有對T位的投射實際上與問題相關。 – 2010-03-22 09:00:41

3

你可以施放這樣

public List<T> ConvertToList<T>(ArrayList arr) 
{ 
    var list1 = new List<T>(); 
    foreach(var obj in arr) 
    { 
    // Like this 
    list1.Add((T)obj); 

    } 
    return list1; 
} 
+2

這不會編譯; 'as'運算符僅對引用類型有效。 – 2010-03-22 07:59:43

+0

我注意到了,對不起。 :) – 2010-03-22 08:00:38

相關問題