2009-12-16 58 views
8

下面的函数接受一个对象,该对象有时可以是给定类型的数组。在这种情况下,我想这个类型可以用obj [0] .GetType()来确定,假设数组至少有一个成员。我想将这样的数组转换为适当类型的通用列表<T>,但下面的代码只能成功转换为列表<对象>。如何才能做到这一点?将任意类型的数组转换为列表<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; 
     } 

注意GetSerializedObject()实现了属于IDataContractSurrogate接口的功能,所以我不认为我可以改变它的签名,如图所示。

回答

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

什么属于“...”的地方? – 2009-12-16 21:19:53

+1

@nw:您放置Jon定义的ConvertArray方法的类。也就是说,如果将'ConvertArray'方法放入名为'ArrayConverter'的类中,则将'...'替换为'ArrayConverter'。 – jason 2009-12-16 21:41:42

+1

@Jon:'TargetType'应该是'Type'。 – jason 2009-12-16 21:45:58

3

尝试CAST()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 2009-12-16 20:52:58

+2

GetSerializedObject()实现了一个属于IDataContractSurrogate接口的函数,所以我不认为我可以改变它的签名,如图所示。 – 2009-12-16 21:14:28

相关问题