2009-12-16 3 views
8

아래 함수는 특정 유형의 배열 일 수있는 객체를 허용합니다. 이 경우 배열에 적어도 하나의 멤버가 있다고 가정하고 유형을 obj [0] .GetType()으로 결정할 수 있다고 가정합니다. 이러한 배열을 적절한 형식의 일반 목록 <T>으로 변환하고 싶습니다. 그러나 아래 코드는 < 개체 >으로 변환하는 경우에만 성공합니다. 어떻게 할 수 있습니까? GetSerializedObject()는 IDataContractSurrogate 인터페이스에 속하는 기능을 구현하므로 I는 I 바와 같이 그 특성을 변경할 수 있다고 생각하지 않는모든 유형의 배열을 List로 변환합니다. <T> (C#)

 
     public object GetDeserializedObject(object obj, Type targetType) 
     { 
      if (obj is Array) 
      { 
       List<object> obj2 = new List<object>(); 
       for (int i = 0; i < ((Array)obj).Length; i++) 
       { 
        obj2.Add(((object[])obj)[i]); 
       } 
       obj = obj2; 
      } 
      return obj; 
     } 

참고.

답변

16

에서 원하는 유형을 지정할 수 있습니다, 당신이 ' 그것을하기위한 제네릭 메서드를 만들고 리플렉션으로 호출하려고합니다. 예를 들어 :

private static List<T> ConvertArray<T>(Array input) 
{ 
    return input.Cast<T>().ToList(); // Using LINQ for simplicity 
} 

public static object GetDeserializedObject(object obj, Type targetType) 
{ 
    if (obj is Array) 
    { 
     MethodInfo convertMethod = typeof(...).GetMethod("ConvertArray", 
      BindingFlags.NonPublic | BindingFlags.Static); 
     MethodInfo generic = convertMethod.MakeGenericMethod(new[] {targetType}); 
     return generic.Invoke(null, new object[] { obj }); 
    } 
    return obj; 
} 

은 (당신이 컴파일 타임에 유형을 알고 경우에, 다만 그것을 일반적인 방법을 직접 CastToList를 호출합니다.) 나는 완전히 다른 방향으로 갈 거라고

+2

"..."의 자리에 속한 것은 무엇입니까? –

+1

@nw : Jon이 정의한'ConvertArray' 메쏘드를 두는 클래스입니다. 즉,'ConvertArray' 메쏘드를'ArrayConverter'라는 클래스에 넣으면'...'을'ArrayConverter'로 대체합니다. – jason

+1

@Jon :'TargetType'은'Type'이어야합니다. – jason

3

캐스트를보십시오()의 LINQ 방법 :

public object GetDeserializedObject<T>(object obj) 
    { 
     if (obj is Array) 
     { 
      var list = ((Array)obj).Cast<T>().ToList(); 
      obj = list; 
     } 
     return obj; 
    } 

그리고 당신은 컴파일 타임에 유형을 모르는 당신을 가정하면 T.

+1

그러나 이것은 훨씬 더 우아합니다. – rossipedia

+2

GetSerializedObject()는 IDataContractSurrogate 인터페이스에 속한 함수를 구현하므로 표시된대로 해당 서명을 변경할 수 있다고 생각하지 않습니다. –

관련 문제