如何使用反射将运行时类型A:IList <AT>的集合转换为类型B:IList <BT>的新集合?

JBeurer

关于编译时的类型一无所知。

object TransformObject(object oldObject, Type newType, Func<object, object> transform)
{
    if(obj.GetType().ImplementsGenericInterface(typeof(IList<>))
    && newType.ImplementsGenericInterface(typeof(IList<>)))
    {
        object newCollection = Activator.CreateInstance(newType);

        // This is where it gets tricky:
        // 1. How to iterate over the old collection?
        // 2. How to add each element in the new collection?
        object oldCollection = oldObject as IEnumerable;
        foreach(var oldItem in oldCollection)
        {
            object newItem = transform(oldItem);
            newCollection.Add(newItem);
        }

        // 3. How to ensure that the order in the new collection is preserved?

        return newCollection;
    }

    return null;
}

自然,这是行不通的。

在运行时已知的是:

  • oldCollection.GetType()实现type IList<AT>
  • newType 实施类型 IList<BT>
  • 函数object transform(object oldObject)负责将类型AT的对象转换为类型的新对象BT或将对象映射到不同类型的对象。映射是未知的编译时。
肯德祖

试试这个解决方案:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;


public class Test
{
    static bool ImplementsGenericInterface(Type type, Type genericInterface)
    {
        return type.GetInterfaces().Any(i => i.GetGenericTypeDefinition() == genericInterface);
    }

    static object TransformObject(object oldObject, Type newType, Func<object, object> transform)
    {
        if (ImplementsGenericInterface(oldObject.GetType(), typeof(IList<>))
           && ImplementsGenericInterface(newType, typeof(IList<>)))
        {
            object newCollection = Activator.CreateInstance(newType);
            var method = newType.GetMethod("Add");

            foreach (var item in (IEnumerable)oldObject)
            {
                var newItem = transform(item);
                method.Invoke(newCollection, new object[] { newItem });
            }

            return newCollection;
        }

        return null;
    }

    public static void Main()
    {
        var list1 = new List<int>() { 1, 2, 3 };

        var list2 = (List<string>)TransformObject(list1, typeof(List<string>), o => o.ToString());

        foreach (var item in list2)
            Console.WriteLine(item);

        Console.ReadKey();
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将类型“系统集合generic.iList <long>转换为long []”

来自分类Dev

按类型将集合转换为数组

来自分类Dev

如何使用反射将IList动态转换为任意数据类型的数组

来自分类Dev

将枚举集合转换为字典给定类型

来自分类Dev

将集合转换为可散列类型

来自分类Dev

Oracle APEX - 将字段从集合转换为 DATE 类型

来自分类Dev

如何添加新对象的集合?

来自分类Dev

如何添加新对象的集合?

来自分类Dev

在运行时将IList <string>强制转换为IList <object>

来自分类Dev

Java集合类型不匹配:无法从TreeSet转换为SortedSet

来自分类Dev

如何使用函数将元素添加到IList集合

来自分类Dev

在Groovy中将字符串集合的类型强制转换为枚举集合

来自分类Dev

在Groovy中将字符串集合的类型强制转换为枚举集合

来自分类Dev

对集合的键类型使用比较功能会导致运行时错误

来自分类Dev

将“集合”转换为小写

来自分类Dev

将集合转换为列表

来自分类Dev

将[AnyObject]强制转换为可能是或可能不是集合类型的通用类型

来自分类Dev

java 8流从类型A的集合创建类型B的集合

来自分类Dev

将单个数据库中的所有集合转换为新数据库

来自分类Dev

如何将列表集合转换为派生集合对象?

来自分类Dev

在 C# 中,您可以将对象类型向上转换为通用“对象”的集合类型吗?

来自分类Dev

将未知对象强制转换为接口的通用接口(来自最初的显式通用类型,通用集合类型的类型)

来自分类Dev

将LINQ匿名类型转换为IList <>时出错

来自分类Dev

无法将源类型'List <Person>'转换为IList <ISomething>

来自分类Dev

将LINQ匿名类型转换为IList <>时出错

来自分类Dev

如何将数组转换为集合

来自分类Dev

将枚举转换为F#中的列表或序列或通用集合类型

来自分类Dev

将字段转换为其他类型并批量更新整个集合?

来自分类Dev

将特定类型的集合强制转换为字符串数组

Related 相关文章

  1. 1

    将类型“系统集合generic.iList <long>转换为long []”

  2. 2

    按类型将集合转换为数组

  3. 3

    如何使用反射将IList动态转换为任意数据类型的数组

  4. 4

    将枚举集合转换为字典给定类型

  5. 5

    将集合转换为可散列类型

  6. 6

    Oracle APEX - 将字段从集合转换为 DATE 类型

  7. 7

    如何添加新对象的集合?

  8. 8

    如何添加新对象的集合?

  9. 9

    在运行时将IList <string>强制转换为IList <object>

  10. 10

    Java集合类型不匹配:无法从TreeSet转换为SortedSet

  11. 11

    如何使用函数将元素添加到IList集合

  12. 12

    在Groovy中将字符串集合的类型强制转换为枚举集合

  13. 13

    在Groovy中将字符串集合的类型强制转换为枚举集合

  14. 14

    对集合的键类型使用比较功能会导致运行时错误

  15. 15

    将“集合”转换为小写

  16. 16

    将集合转换为列表

  17. 17

    将[AnyObject]强制转换为可能是或可能不是集合类型的通用类型

  18. 18

    java 8流从类型A的集合创建类型B的集合

  19. 19

    将单个数据库中的所有集合转换为新数据库

  20. 20

    如何将列表集合转换为派生集合对象?

  21. 21

    在 C# 中,您可以将对象类型向上转换为通用“对象”的集合类型吗?

  22. 22

    将未知对象强制转换为接口的通用接口(来自最初的显式通用类型,通用集合类型的类型)

  23. 23

    将LINQ匿名类型转换为IList <>时出错

  24. 24

    无法将源类型'List <Person>'转换为IList <ISomething>

  25. 25

    将LINQ匿名类型转换为IList <>时出错

  26. 26

    如何将数组转换为集合

  27. 27

    将枚举转换为F#中的列表或序列或通用集合类型

  28. 28

    将字段转换为其他类型并批量更新整个集合?

  29. 29

    将特定类型的集合强制转换为字符串数组

热门标签

归档