2010-03-22 55 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

相关问题