c# 调用webservice 写了一个通用的方法来根据ws的方法名通过反射来调用,如何将返回值转换成对应的类型

lovecc5800 2016-03-06 11:00:46
c# 调用webservice 写了一个通用的方法来根据ws的方法名通过反射来调用,如何将返回值转换成对应的类型

部分代码如下:
Type t = wsServer.GetType();//获取ws服务的类型,便于后面根据方法名来调用方法
MethodInfo mi= t.GetMethod("getAListByPage");//通过方法名getAListByPage获取MethodInfo
var aList = mi.Invoke(wsServer, new object[] { 0, 10 });//调用方法,返回的是A类型的数组
现在我想获取aList数组中的元素个数,及后续遍历操作(将其中个值存到另一个对象中),想把aList转换成A[]数组

目前通过mi.ReturnType可以知道返回值的Type

问题: 要如何将aList转换成对应的A数组

希望前辈解答,或者提些思路。
...全文
261 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
software_artisan 2016-03-07
  • 打赏
  • 举报
回复
引用 6 楼 lovecc5800 的回复:
[quote=引用 1 楼 xuanbg 的回复:] 这种情况下,返回值最好是一个json。这样你的通用方法完全可以不用解析直接把这个json返回给方法调用者,具体的逻辑处理方法肯定是可以确定类型的,这个时候反序列化成确定的类型就好
谢谢您的回答,webservice是别人写好的,我只能调用。很不幸我就是这个方法调用者,虽然我知道他的类型,但因为是动态调用我不能在使用的时候直接强制类型转换,每个方法的返回类型不一样。不知道有没有其他的一些方法建议[/quote] 这样啊,那只能用泛型来解决了。调用时指定类型就好了,只要调用时知道是什么类型。
  • 打赏
  • 举报
回复
另外我要说一下,在开发组织中非常忌讳有人胡乱反射。这不仅仅是性能问题,最主要地是“组织、测试、调试”问题。 .net 框架以及 vs开发工具对webservice底层进行了抽象化,它已经将需要反射的许多层封装在底层,目的就是给你提供一个强类型的、高性能且可靠开发调试的高层次的编程平台。你只需要创建不同的 webservice 文件,vs编译之后就能自动处理不同命令的解析。 现在,你再来在高层次再去模拟一遍底层,这是干什么呢?当然,拿来玩玩可以,但是使用webservice还是要用vs给你直接生成好的webservice 强类型代理机制。 例如我们对于 tcp 消息进行解析、寻找和驱动处理过程,这都需要自己封装底层,这时候才需要这种东西。而那些在别人的框架的顶层再去写成低层弱类型代码的方式,不仅仅是性能问题,而且最主要地是在开发中反而会引入许多坑。
  • 打赏
  • 举报
回复
既然你知道是“A数组”,直接写 var aList = (A[ ])mi.Invoke(wsServer, new object[] { 0, 10 });
software_artisan 2016-03-06
  • 打赏
  • 举报
回复
这种情况下,返回值最好是一个json。这样你的通用方法完全可以不用解析直接把这个json返回给方法调用者,具体的逻辑处理方法肯定是可以确定类型的,这个时候反序列化成确定的类型就好
lovecc5800 2016-03-06
  • 打赏
  • 举报
回复
引用 12 楼 tcmakebest 的回复:
[quote=引用 11 楼 lovecc5800 的回复:] [quote=引用 10 楼 tcmakebest 的回复:] 反射都会用了,这个有什么难的,如下: A[] arr = (A[])aList; 当然通过mi.ReturnType判断一下是不是真的A[]很必要,免得出异常.
谢谢您的回答,你可以认为你只知道mi.ReturnType,而不知道A类型,此时应该如何处理[/quote] 楼主真有意思,不知道有A类型,又哪来的转成A类型的问题呢[/quote] 我的意思是虽然知道A类型,但是不能用它来强制转换,因为这是一个动态调用的webservice方法,方法变了返回值也会跟着变,也许是B[]、也许是C[]但是通过mi.ReturnType可以知道当前调用的方法的返回值类型Type
tcmakebest 2016-03-06
  • 打赏
  • 举报
回复
引用 11 楼 lovecc5800 的回复:
[quote=引用 10 楼 tcmakebest 的回复:] 反射都会用了,这个有什么难的,如下: A[] arr = (A[])aList; 当然通过mi.ReturnType判断一下是不是真的A[]很必要,免得出异常.
谢谢您的回答,你可以认为你只知道mi.ReturnType,而不知道A类型,此时应该如何处理[/quote] 楼主真有意思,不知道有A类型,又哪来的转成A类型的问题呢
lovecc5800 2016-03-06
  • 打赏
  • 举报
回复
引用 10 楼 tcmakebest 的回复:
反射都会用了,这个有什么难的,如下: A[] arr = (A[])aList; 当然通过mi.ReturnType判断一下是不是真的A[]很必要,免得出异常.
谢谢您的回答,你可以认为你只知道mi.ReturnType,而不知道A类型,此时应该如何处理
tcmakebest 2016-03-06
  • 打赏
  • 举报
回复
反射都会用了,这个有什么难的,如下: A[] arr = (A[])aList; 当然通过mi.ReturnType判断一下是不是真的A[]很必要,免得出异常.
Poopaye 2016-03-06
  • 打赏
  • 举报
回复
你不愿意使用接口,又不愿意为每种类型写一个处理方法 这种想法就是不切实际的 干脆全用反射来处理好了
lovecc5800 2016-03-06
  • 打赏
  • 举报
回复
引用 7 楼 shingoscar 的回复:
如果你只是想获取数量,以及遍历 不妨强转成ICollection,通常的集合都会实现这个接口的 如果数量也不需要知道,就转成IEnumerable
谢谢您的回答,我需要知道他的类型,后续会用到,所以想知道如何转成他原本的类型。在我看来这个方法就像一个数据接收器一样,将不同类型的数据获取到,再转为不同的类型对应的数据。 转成ICollection无法达到我后期处理的需求
Poopaye 2016-03-06
  • 打赏
  • 举报
回复
如果你只是想获取数量,以及遍历 不妨强转成ICollection,通常的集合都会实现这个接口的 如果数量也不需要知道,就转成IEnumerable
lovecc5800 2016-03-06
  • 打赏
  • 举报
回复
引用 1 楼 xuanbg 的回复:
这种情况下,返回值最好是一个json。这样你的通用方法完全可以不用解析直接把这个json返回给方法调用者,具体的逻辑处理方法肯定是可以确定类型的,这个时候反序列化成确定的类型就好
谢谢您的回答,webservice是别人写好的,我只能调用。很不幸我就是这个方法调用者,虽然我知道他的类型,但因为是动态调用我不能在使用的时候直接强制类型转换,每个方法的返回类型不一样。不知道有没有其他的一些方法建议
lovecc5800 2016-03-06
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
另外我要说一下,在开发组织中非常忌讳有人胡乱反射。这不仅仅是性能问题,最主要地是“组织、测试、调试”问题。 .net 框架以及 vs开发工具对webservice底层进行了抽象化,它已经将需要反射的许多层封装在底层,目的就是给你提供一个强类型的、高性能且可靠开发调试的高层次的编程平台。你只需要创建不同的 webservice 文件,vs编译之后就能自动处理不同命令的解析。 现在,你再来在高层次再去模拟一遍底层,这是干什么呢?当然,拿来玩玩可以,但是使用webservice还是要用vs给你直接生成好的webservice 强类型代理机制。 例如我们对于 tcp 消息进行解析、寻找和驱动处理过程,这都需要自己封装底层,这时候才需要这种东西。而那些在别人的框架的顶层再去写成低层弱类型代码的方式,不仅仅是性能问题,而且最主要地是在开发中反而会引入许多坑。
@以专业开发人员为伍 首先,谢谢您的回答。以上的结论我是赞成的。毕竟重复造轮子是不明智的。 但我这个功能有一个背景,webservice是别人写好的,我只能调用,他返回的是一个类型的数组。需要调用很多个不同的这样的方法。在这里因为调用的代码基本都是一样的,所以我想到写一个公用的方法来动态调用webservice方法,而我知道的实现方式恰好就是通过反射,根据方法名称来调用,虽然我知道返回值的类型(就像我知道方法名一样,但是我不能通过wsServer.方法名来实现调用)但是因为是动态调用不同的方法有不同的返回值类型(虽然都是数组),所以不能直接用A[]来强制类型转换。mi.ReturnType指向的是每次调用的具体方法的返回类型,但是我好像不能使用这个来转换数据。请问还有其他的方法吗?还是说我只能为每一个方法都写一个调用的过程,如: A[] a=yktServer.getAByPage(0, 10); B[] b=yktServer.getBByPage(0, 10); ............ 当然我还会在这个方法里做一些例如访问时间的记录,如果分开调用就是要每个调用都写一个访问时间的记录,这样做会产生大量的重复代码

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧