2010-03-22 2 views
2

어쨌든 객체를 실제 유형에 unbox하려면 어떻게해야합니까?객체를 해당 유형의 항목으로 박스에서 꺼내십시오.

기본적으로 내가 int 또는 double, 아니면 다른 유형의 목록 실제로 ArrayList, 배열 목록을 감안할 때입니다 (이 중 하나가 될 수 있지만, 중 모든 int 또는 double, 아니 혼합이다). 이제 실제 유형에 따라 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

같은 캐스트 그냥 평범한 유형은,이 일을 훨씬 쉽게 방법이 있습니다 ArrayList에만 해당하는 것을 사용하지 않기 때문에이 매개 변수를 IEnumerable으로 일반화했습니다.

3

Convert 클래스를 사용할 수 있습니다. '

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

(I :

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

Erhm, o를 반환합니다. bject, 당신이 처음에 가지고있는 것입니다. 당신은 2 번 전환을하고 있습니다. '(T) obj;'로 충분할 것입니다. –

+0

@Filip 당신 말이 맞습니다. 그러나이 솔루션은 좀 더 관대합니다. 그런 식으로 Convert가 실패하지 않으면 문자열을 int로 변환 할 수도 있습니다. – gsharp

+2

그러나 그것은 질문 된 질문이 아닙니다. 개인적으로 ArrayList에 박스형 값만 포함될 것으로 예상되는 경우 예기치 않은 유형의 문자열 또는 실제로 boxed 값을 포함하기 시작하면 예외가 발생합니다. 물어 본 질문과 실제로 관련이있는 것은 T 비트로만 캐스팅됩니다. –

3

당신은 당신이 .NET 3.5을 사용하는 경우이

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 '연산자는 참조 형에 대해서만 유효합니다. –

+0

죄송합니다. :) –

관련 문제