【.Net码农】【淘宝API】淘宝API开发系列--读取实体类的属性的备注作为表头的应用

http://www.cnblogs.com/wuhuacong/archive/2010/03/19/1689828.html

在做淘宝API的学习过程中,发现一个API的封装类库Top4NET对操作封装的比较好,试用了一下,效果非常不错,另外由于淘宝的API对象参数很多,多数是英文的,另一方面Top4NET的实体类对象备注信息很详细,因此可以考虑吧实体类的属性描述信息作为列表的表头说明使用。

我们看到他的Domain里面的实体类信息描述很详细,代码如下所示:

  /// <summary>
    /// 商品结构
    /// </summary>
    [Serializable]
    [JsonObject]
    [XmlRoot("item")]
    public class Item : BaseObject
    {
        /// <summary>
        /// 商品编号
        /// </summary>
        [JsonProperty("iid")]
        [XmlElement("iid")]
        public string Iid { get; set; }

        /// <summary>
        /// 商品地址
        /// </summary>
        [JsonProperty("detail_url")]
        [XmlElement("detail_url")]
        public string DetailUrl { get; set; }

        /// <summary>
        /// 商品数字编号
        /// </summary>
        [JsonProperty("num_iid")]
        [XmlElement("num_iid")]
        public string NumIid { get; set; }

        /// <summary>
        /// 商品标题
        /// </summary>
        [JsonProperty("title")]
        [XmlElement("title")]
        public string Title { get; set; }

        /// <summary>
        /// 卖家昵称
        /// </summary>
        [JsonProperty("nick")]
        [XmlElement("nick")]
        public string Nick { get; set; }

我们看看Top4NET类库生成的字段描述信息,它是一个叫做Top4Net.xml的文件(VS自动生成出来的),结构如下所示:

 

 这些是很详细的类库备注信息,如果能在代码中读取对应的属性备注信息出来,那么各项内容的显示,就不需要太多的手工字段的转义工作了,虽然在性能上有点点损失,但是开发效率上会提高不少。

现在的问题就是该如何才能正确读取到相关的信息,这个操作可以通过XML文档的检索实现的,我在测试的时候,发现可以通过3种方式来读取到正确节点的信息的。其中上面的Member中的Name第一个字符有T、P、M等字样,其中的T是类,P是属性,M是方法的意思。

/// <summary>
        /// 根据类属性名称,获取对应的备注信息(如果键名不存在,返回空)
        /// </summary>
        /// <param name="classPropertyName">类全局名称(带命名空间)</param>
        /// <returns></returns>
        public static string GetPropertySummary(string classPropertyName)
        {
            string filePath =  Path.Combine(Application.StartupPath,"Top4Net.xml");
            string keyName = string.Format("//doc/members/member[@name='P:{0}']/summary", classPropertyName);

            XPathDocument doc = new XPathDocument(filePath);
            XPathNavigator nav = doc.CreateNavigator();
            XPathNodeIterator iterator = nav.Select(keyName);

            string result = "";
            try
            {
                if (iterator.MoveNext())
                {
                    XPathNavigator nav2 = iterator.Current.Clone();
                    result += nav2.Value;
                }
            }
            catch (Exception ex)
            {
                ;
            } 

            return result.Trim();
        }

        /// <summary>
        /// 根据类属性名称,获取对应的备注信息(如果键名不存在,返回空)
        /// </summary>
        /// <param name="classPropertyName">类全局名称(带命名空间)</param>
        /// <returns></returns>
        public static string GetPropertySummary2(string classPropertyName)
        {
            string filePath = Path.Combine(Application.StartupPath, "Top4Net.xml");
            string keyName = string.Format("//doc/members/member[@name='P:{0}']/summary", classPropertyName);

            XmlDocument document = new XmlDocument();
            document.Load(filePath);

            string result = "";
            XmlNode node = document.SelectSingleNode(keyName);
            if (node != null)
            {
                result = node.FirstChild.Value;
            }

            return result.Trim();
        }

        /// <summary>
        /// 根据类属性名称,获取对应的备注信息(如果键名不存在,返回空)
        /// </summary>
        /// <param name="classPropertyName">类全局名称(带命名空间)</param>
        /// <returns></returns>
        public static string GetPropertySummary3(string classPropertyName)
        {
            string strReturn = string.Empty;
            try
            {
                string keyName = string.Format("P:{0}", classPropertyName);
                string filePath = Path.Combine(Application.StartupPath, "Top4Net.xml");
                XmlDocument document = new XmlDocument();
                document.Load(filePath);

                XmlNodeList nodes = document.GetElementsByTagName("member");
                for (int i = 0; i < nodes.Count; i++)
                {
                    //获得将当前元素的key属性
                    XmlAttribute attribute = nodes[i].Attributes["name"];
                    //根据元素的第一个属性来判断当前的元素是不是目标元素
                    if (attribute != null && (attribute.Value == keyName))
                    {
                        XmlNode node = nodes[i].ChildNodes[0];
                        if (node != null)
                        {
                            strReturn = node.FirstChild.Value;
                            break;
                        }
                    }
                }
            }
            catch
            {
                ;
            }

            return strReturn.Trim();
        }

由于上述的方法参数classPropertyName是类的全称名字,因此我们需要通过反射方式获取对应的属性名称信息,由于属性名称的简称对我们也有用,因此编写一个API函数,返回Dictionary<string,string>类型即可。

 /// <summary>
        /// 获取类属性的名称和全称字典列表
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static Dictionary<string, string> GetPropertyFullNameDict(object obj)
        {
            Dictionary<string, string> dict = new Dictionary<string, string>();
            Type t = obj.GetType();

            PropertyInfo[] pi = t.GetProperties();
            foreach (PropertyInfo info in pi)
            {
                if (!dict.ContainsKey(info.Name))
                {
                    dict.Add(info.Name, string.Format("{0}.{1}", t.FullName, info.Name));
                }
            }

            return dict;
        }
最后我们在进一步封装,把实体类对象的备注信息取出来放到字典对象中,如下所示:
/// <summary>
        /// 获取类属性名称和描述信息的对照字典
        /// </summary>
        /// <param name="obj">实体类对象</param>
        /// <returns></returns>
        public static Dictionary<string, string> GetPropertyAliasDict(object obj)
        {
            Dictionary<string, string> dict = new Dictionary<string, string>();
            Dictionary<string, string> propertyNameDict = XmlHelper.GetPropertyFullNameDict(obj);
            StringBuilder sb = new StringBuilder();
            foreach (string simpleName in propertyNameDict.Keys)
            {
                string summary = XmlHelper.GetPropertySummary(propertyNameDict[simpleName]);
                if (string.IsNullOrEmpty(summary))
                {
                    summary = simpleName;//如果找不到对象的名称,那么取其属性名称作为Summary信息
                }

                if (!dict.ContainsKey(simpleName))
                {
                    dict.Add(simpleName, summary);
                }
            }
            return dict;
        }
有了这个API函数,我们就可以随意的在界面中,通过极少的代码,实现表头中文化的自动转义了。下面我给我参考代码:
//查询商品信息(不含类别)
            ItemsGetRequest itemReq = new ItemsGetRequest();
            itemReq.Fields = "iid,title,nick,pic_url,cid,price,type,delist_time,post_fee,score,volume,location.city,location.state";
            itemReq.Query = "笔记本";
            //itemReq.Cid = "14";
            itemReq.OrderBy = "volume:desc";
            itemReq.PageNo = 1;
            itemReq.PageSize = 40;

            #region 给显示控件添加别名解析

            //特殊字段采用手工修改
            this.winGridView1.AddColumnAlias("Created", "创建时间");
            this.winGridView1.AddColumnAlias("Modified", "修改时间");

            //其他字段代码自动转义
            Dictionary<string, string> dictAlias = XmlHelper.GetPropertyAliasDict(new Item());
            foreach (string simpleName in dictAlias.Keys)
            {
                this.winGridView1.AddColumnAlias(simpleName, dictAlias[simpleName]);
            }
            #endregion

            //显示列表信息
            ResponseList<Item> itemRsp = client.Execute(itemReq, new ItemListJsonParser());
            this.winGridView1.DataSource = itemRsp.Content;
            this.winGridView1.PrintTitle = "查询商品信息(不含类别)";

最后给出一个测试程序的界面截图,供参考:

 

取实体类备注信息作为界面展示用途,还可以应用在很多其他地方,淘宝Top4NET只是一个恰当的应用场景而已,对于大量备注完整的实体类,使用这些资源应该还是比较不错的选择。 

主要研究技术:代码生成工具、会员管理系统、客户关系管理软件、病人资料管理软件、Visio二次开发、酒店管理系统、仓库管理系统等共享软件开发
专注于 Winform开发框架/混合式开发框架Web开发框架Bootstrap开发框架微信门户开发框架的研究及应用
  转载请注明出处:
撰写人:伍华聪   http://www.iqidi.com 
    





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
mcg-helper是一款研发个化性流程自动化工具,提供一套可视化“流程自动化”的规范,丰富的拖拽控件,良好的交互性,基于流程图实现自动化,能够很好感知到可控性、实时性、可追溯性。更好的解决在研发工作中较典型的代码生成、应用部署、环境搭建、模拟环境、自动发现与检测、数据处理等需求场景,从而达到减少简化工作量。其核心亮点在于打造自己的流程控件,实现自定义需求。 mcg-helper流程自动化工具功能: 以研发工作中的实际需求场景为例: 一、代码生成:快速构建代码生成功能,通过可视化界面,采用拖拽式控件及连接线绘制流程图,自定义实现生成任何想要的代码。 二、环境搭建:以java应用来讲,比如安装jdk,tomcat,zookeeper,mq,hbase,mysql等等都可以实现自动化。 三、应用部署:GIT代码拉取,MAVEN打包,SFTP上传,Linux脚本执行,自动化一气呵成,且轻松实现切换用户等交互性需求,数据初始化,多应用的启动顺序或特定条件触发,均可实现自动化操作。 四、模拟操作:接口调试,数据模拟,功能自测等等,适用于测试场景。 五、自动检测:基于流程循环,实现主动触发、检测、控制的需求场景,如服务器性能检测,应用存活检测,循环扫描操作等。 六、数据处理:如开发环境定期同步数据到测试环境,或多个数据库数据加工过滤等需求。 七、WEB SSH:通过浏览器操作Linux,简单便捷。 整体上讲,基于流程图清晰易直观,且控件使用简单,易掌控,学习门槛低。系统“主页”里面有视频教程链接,能够很好的上手和玩转mcg-helper。 mcg-helper流程自动化工具特点: 轻量级、无浸入性、部署简单(无需安装数据库或特定配置,jdk8、tomcat8即可独立运行) 跨平台性、可移植性、可扩展性,基于B/S架构,通过浏览器即可访问 一套流程自动化规范,轻松快捷实现流程自动化 二次开发,打造自定义拖拽流程控件,让流程自动化更贴近需求 WEB SSH,通过浏览器即可与Linux交互,支持google身份认证
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值