反射,获取对象集合并将这些对象转换为所需的对象类型



所以。。我有一些WCF服务,这些WCF服务是通过反射调用的。它们返回的数组中的对象对于被调用的每个服务都是不同的。

我的任务是获取这些对象,并将它们映射到BusinessObjects中的对象。它们由T定义。

    public virtual IQueryable<T> GetAll()
    {
        //Methods retreives an array of objects.
        var blah = _getAllFromWcf.Invoke(_rawServiceObject, new object[] {});
        //Says that this is an array
        var blahsType = blah.GetType();
        //This is the type of object in the array
        var blahsElementType = blahsType.GetElementType();
        //This is where i want to convert the element in the array to the type T so that i can return it in the IQueryable<T>
        blah.MapCollection<'The type of element in blah', T>();
        return null;
    }

等等。地图集<>是我制作的一个扩展方法,它使用AutoMapper并转换列表中的元素。

MapCollection现在当然不会工作,因为它不明白blah是一个数组,"blah中元素的类型"也不工作,因为我现在不知道对象的类型。。。。

有人有什么指导吗?

您的扩展方法不能将类型用作泛型参数,因为它在运行时是未知的。您必须将它作为Type类型的普通参数传递给您的扩展。AutoMapper还提供了将类型信息作为普通参数传递的方法。

您也可以使用LinQ与AutoMapper:进行映射

blah.Select(item => Mapper.Map(item, item.GetType(), typeof(T)) as T)

我最终是这样做的。。如果你对此有意见,或者只是有更好的方法,请随时评论:(

    public virtual IQueryable<T> GetAll()
    {
        //Methods retreives an array of objects.
        var collectionFromWcfService = _getAllFromWcf.Invoke(_rawServiceObject, new object[] {});
        //Says that this is an array
        var typeOfArray = collectionFromWcfService.GetType();
        //This is the type of object in the array
        var elementTypeInArray = typeOfArray.GetElementType();
        MethodInfo method = typeof(Extensions).GetMethod("MapCollectionWithoutExtension");
        MethodInfo generic = method.MakeGenericMethod(elementTypeInArray,typeof(T));
        var convertedListOfObjects = (List<T>)generic.Invoke(this, new []{ collectionFromWcfService });
        return convertedListOfObjects.AsQueryable(); 
    }

有了这个解决方案,我隐藏了AutoMapper实现,现在可以通过另一个工具进行转换,或者在以后需要时手动进行转换。

相关内容

  • 没有找到相关文章

最新更新