Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 751|回复: 0

动态调用Web Service及C#反射返回类或List对象问题解决

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-6-27 14:25:36 | 显示全部楼层 |阅读模式
    今天跟同事闲聊时, 谈到动态web Service返回类和list对象处理问题, 开始以为和静态调用一样的,先建立一个跟服务器端返回类型相同字段的类(因为是动态调用的,所以没有在本地生成代理类, 无法使用服务器端类型.), 然后将返回的object类型强制转换为需要的类型就行了, 谁知道实行起来还不是那回事了,不论如何转换返回的都是null, 如下图:
     
        上网google了下,发现很多人也碰到过同样的问题,但都没有得到解决,既然网上找不到答案,只有靠自己慢慢找了。
    而object对象又不能直接访问原始映射类的属性, 并且只有一个GetType方法可用,猜想或许利用Type反射可以读取出来吧,但Type类有很多属性,到底是哪一个呢? GetMembers(), GetPropertys(), GetMethods()…
    一个个试了,没有一个适合访的,大部分返回的都是null, 最后发现有个GetFileds()方法,而这个方法返回的是FieldInfo数组,用断点调试看了一下,发现这个数组的长度刚好是返回字段的长度,其 Name属性就是服务器端返回类型的一个字段名称,再继续看FieldInfo类,FieldInfo类有个GetValue()方法,根据字面意思理 解, 应该是用来获取这个字段的值,可是需要一个object参数,而这个object参数就是Type类的那个对象。 编写代码试了一下, 发现还真的可以获取数据了。
    对于处理返回单个对象的功能是实现了, 要是返回数组呢?
    第一感觉也是依照前面那样处理就行了, 于是乎,将代码复制下来, 结果出乎意外了, GetFields()返回长度为0, 折腾了好一会,还是慢慢看Type类了,发现其IsArray是true, 还有一个GetElementType()方法,既然Type不行,我想那应访是ElementType吧:
    Type tp = o.GetType();
    tp = tp.GetElementType();
    FiledInfo[] fi = tp.GetFields();

        这会fi有值了,先前一样,只可惜只有一个对象的字段值,心想可能是这样的了,但接下来又纳闷了, 用FieldInfo的GetValue值时提示传入的对象错误。Type及FieldInfo说明翻遍了也没新的发现,后来一想,WebService 返回数组对象跟利用反射返回数组不一样的吗? Web Service中没人碰到过这样的问题,也许在反射应用中有人解决了呢? 于是google “C# 反射返回数组”, 看到有人说直接将object强制转换object数组,自己虽觉得这样可能不行, 但没办法下还是试试吧!还真不明白,这样子竟然真的可以!!最终完整代码如下:
    View Code
         protected  void Page_Load( object sender, EventArgs e)
        {
             object user = WebServiceHelper.InvokeWebService( " http://localhost/Service.asmx "" Service ",
                                 " GetObject "null);
            PrintData(user);    
             object lst = WebServiceHelper.InvokeWebService( " http://localhost/Service.asmx "" Service ",
                         " GetList "null);
            Type Tp = lst.GetType();
             if (Tp.IsArray)
            {
                 object[] users = lst  as  object[];
                 for ( int i =  0; i < users.Length; i++)
                {
                    PrintData(users);
                }
            }
             else
            {
                PrintData(lst);
            }
        }
         public  void PrintData( object o)
        {
            Type Tp = o.GetType();
            FieldInfo[] fields = Tp.GetFields();
            Response.Write( " Fields:<br/> ");
             for ( int i =  0; i < fields.Length; ++i)
            {
                FieldInfo filed = fields.GetValue(i)  as FieldInfo;
                 string str = String.Format( " Field Name:{0}/tField Value:{1} ", filed.Name, filed.GetValue(o));
                Response.Write(str +  " <br/> ");
            }
            Response.Write( " <br/> ");
        }
    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-22 21:48 , Processed in 0.055662 second(s), 27 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表