所以。。我有一些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实现,现在可以通过另一个工具进行转换,或者在以后需要时手动进行转换。