将任何类型的数组转换为List <t>(C#)</t>

时间:2009-12-16 20:47:28

标签: c#

下面的函数接受一个对象,该对象有时可以是给定类型的数组。在这种情况下,我认为可以使用obj [0] .GetType()来确定类型,假设数组至少有一个成员。我想将这样的数组转换为通用List&lt; T&gt;适当的类型,但下面的代码只能成功转换为List&lt; object&gt;。怎么办呢?

        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接口的函数,所以我认为我不能改变它的签名,如图所示。

2 个答案:

答案 0 :(得分: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。)

答案 1 :(得分: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中指定你想要的类型。