类型转换对象[]为泛型类型K,它也是一个数组

本文关键字:数组 一个 对象 泛型类型 类型转换 | 更新日期: 2023-09-27 18:12:10

我试着写一个泛型类型转换方法,它将适用于复杂对象和对象数组。下面是我的代码:

public void Test()
{
     MyClass2[] t2 = m.MapItem<MyClass1[], MyClass2[]>(t1);
     return;
}
public K MapItem<T, K>(T source)
{
    if (typeof(T).IsArray && typeof(K).IsArray)
    {
        Type ek = typeof(K).GetElementType();
        IList sourceList = (IList)source;
        List<object> tmp = new List<object>();
        for (int i = 0; i < sourceList.Count; i++)
        {
            var k = Activator.CreateInstance(ek);
            tmp.Add(k);
        }
        var resultObj = tmp.ToArray();
        MapItem(source, resultObj);
        //Here i have resultObj is an object[] of the results,
        //which is to be casted result type K
        //BUT DOES NOT WORK!!!
        return (K)Convert.ChangeType(resultObj, typeof(K));
    }
    else
    {
        MethodInfo myMapperMethod = GetMyMapperMethodForThisType(typeof(T), typeof(K));
        return (K)myMapperMethod.Invoke(null, new object[] { source });
    }
}
public K MapItem<T, K>(T source, K dest)
{
    if (typeof(T).IsArray && typeof(K).IsArray)
    {
        IList sourceList = (IList)source;
        IList destList = (IList)dest;
        for (int i = 0; i < sourceList.Count; i++)
        {
            MapItem(sourceList[i], destList[i]);
        }
        return dest;
    }
    else
    {
        MethodInfo myMapperMethod = GetMyMapperMethodForThisType(typeof(T),typeof(K));
        return (K) myMapperMethod.Invoke(null, new object[] { source, dest });
    }
}
private MethodInfo GetMyMapperMethodForThisType(Type type1, Type type2)
{
    //some code to find appropriate function...
}

但是,return (K) Convert.ChangeType(y, typeof(K));不能从object[]转换到K。我怎么能做这个铸造从object[]返回K ?

注意:json序列化工作,但我不想使用反射或序列化。

  string jsonStr = JsonConvert.SerializeObject(resultObj);
  return JsonConvert.DeserializeObject<K>(jsonStr);

类型转换对象[]为泛型类型K,它也是一个数组

基本上我认为你想要避免使用List<object>。你只需要创建一个大小合适的数组:

IList dest = Array.CreateInstance(ek, sourceList.Count);
for (int i = 0; i < sourceList.Count; i++)
{
    dest[i] = Activator.CreateInstance(ek);
}
K result = (K) dest;
// Note that this is calling MapItem<T, K>, not MapItem<T, object[]>
MapItem(source, result);
return result;