Ejemplo n.º 1
0
        /// <summary>
        /// 根据XML信息填充实实体
        /// </summary>
        /// <typeparam name="T">MessageBase为基类的类型,Response和Request都可以</typeparam>
        /// <param name="entity">实体</param>
        /// <param name="doc">XML</param>
        public static void FillEntityWithXml <T>(this T entity, XDocument doc) where T : /*MessageBase*/ class, new()
        {
            entity = entity ?? new T();
            var root = doc.Root;

            var props = entity.GetType().GetProperties();

            foreach (var prop in props)
            {
                var propName = prop.Name;
                if (root.Element(propName) != null)
                {
                    switch (prop.PropertyType.Name)
                    {
                    //case "String":
                    //    goto default;
                    case "DateTime":
                        prop.SetValue(entity, DateTimeHelper.GetDateTimeFromXml(root.Element(propName).Value), null);
                        break;

                    case "Boolean":
                        if (propName == "FuncFlag")
                        {
                            prop.SetValue(entity, root.Element(propName).Value == "1", null);
                        }
                        else
                        {
                            goto default;
                        }
                        break;

                    case "Int32":
                        prop.SetValue(entity, int.Parse(root.Element(propName).Value), null);
                        break;

                    case "Int64":
                        prop.SetValue(entity, long.Parse(root.Element(propName).Value), null);
                        break;

                    case "Double":
                        prop.SetValue(entity, double.Parse(root.Element(propName).Value), null);
                        break;

                    //以下为枚举类型
                    case "RequestMsgType":
                        //已设为只读
                        //prop.SetValue(entity, MsgTypeHelper.GetRequestMsgType(root.Element(propName).Value), null);
                        break;

                    case "ResponseMsgType":    //Response适用
                        //已设为只读
                        //prop.SetValue(entity, MsgTypeHelper.GetResponseMsgType(root.Element(propName).Value), null);
                        break;

                    case "Event":
                        //已设为只读
                        //prop.SetValue(entity, EventHelper.GetEventType(root.Element(propName).Value), null);
                        break;

                    //以下为实体类型
                    case "List`1":                                 //List<T>类型,ResponseMessageNews适用
                        var genericArguments = prop.PropertyType.GetGenericArguments();
                        if (genericArguments[0].Name == "Article") //ResponseMessageNews适用
                        {
                            //文章下属节点item
                            List <Article> articles = new List <Article>();
                            foreach (var item in root.Element(propName).Elements("item"))
                            {
                                var article = new Article();
                                FillEntityWithXml(article, new XDocument(item));
                                articles.Add(article);
                            }
                            prop.SetValue(entity, articles, null);
                        }
                        else if (genericArguments[0].Name == "Account")
                        {
                            List <CustomerServiceAccount> accounts = new List <CustomerServiceAccount>();
                            foreach (var item in root.Elements(propName))
                            {
                                var account = new CustomerServiceAccount();
                                FillEntityWithXml(account, new XDocument(item));
                                accounts.Add(account);
                            }
                            prop.SetValue(entity, accounts, null);
                        }
                        else if (genericArguments[0].Name == "PicItem")
                        {
                            List <PicItem> picItems = new List <PicItem>();
                            foreach (var item in root.Elements(propName).Elements("item"))
                            {
                                var    picItem   = new PicItem();
                                var    picMd5Sum = item.Element("PicMd5Sum").Value;
                                Md5Sum md5Sum    = new Md5Sum()
                                {
                                    PicMd5Sum = picMd5Sum
                                };
                                picItem.item = md5Sum;
                                picItems.Add(picItem);
                            }
                            prop.SetValue(entity, picItems, null);
                        }
                        else if (genericArguments[0].Name == "AroundBeacon")
                        {
                            List <AroundBeacon> aroundBeacons = new List <AroundBeacon>();
                            foreach (var item in root.Elements(propName).Elements("AroundBeacon"))
                            {
                                var aroundBeaconItem = new AroundBeacon();
                                FillEntityWithXml(aroundBeaconItem, new XDocument(item));
                                aroundBeacons.Add(aroundBeaconItem);
                            }
                            prop.SetValue(entity, aroundBeacons, null);
                        }
                        break;
                        break;

                    case "Music":    //ResponseMessageMusic适用
                        Music music = new Music();
                        FillEntityWithXml(music, new XDocument(root.Element(propName)));
                        prop.SetValue(entity, music, null);
                        break;

                    case "Image":    //ResponseMessageImage适用
                        Image image = new Image();
                        FillEntityWithXml(image, new XDocument(root.Element(propName)));
                        prop.SetValue(entity, image, null);
                        break;

                    case "Voice":    //ResponseMessageVoice适用
                        Voice voice = new Voice();
                        FillEntityWithXml(voice, new XDocument(root.Element(propName)));
                        prop.SetValue(entity, voice, null);
                        break;

                    case "Video":    //ResponseMessageVideo适用
                        Video video = new Video();
                        FillEntityWithXml(video, new XDocument(root.Element(propName)));
                        prop.SetValue(entity, video, null);
                        break;

                    case "ScanCodeInfo":    //扫码事件中的ScanCodeInfo适用
                        ScanCodeInfo scanCodeInfo = new ScanCodeInfo();
                        FillEntityWithXml(scanCodeInfo, new XDocument(root.Element(propName)));
                        prop.SetValue(entity, scanCodeInfo, null);
                        break;

                    case "SendLocationInfo":    //弹出地理位置选择器的事件推送中的SendLocationInfo适用
                        SendLocationInfo sendLocationInfo = new SendLocationInfo();
                        FillEntityWithXml(sendLocationInfo, new XDocument(root.Element(propName)));
                        prop.SetValue(entity, sendLocationInfo, null);
                        break;

                    case "SendPicsInfo":    //系统拍照发图中的SendPicsInfo适用
                        SendPicsInfo sendPicsInfo = new SendPicsInfo();
                        FillEntityWithXml(sendPicsInfo, new XDocument(root.Element(propName)));
                        prop.SetValue(entity, sendPicsInfo, null);
                        break;

                    case "ChosenBeacon":    //摇一摇事件通知
                        ChosenBeacon chosenBeacon = new ChosenBeacon();
                        FillEntityWithXml(chosenBeacon, new XDocument(root.Element(propName)));
                        prop.SetValue(entity, chosenBeacon, null);
                        break;

                    case "AroundBeacon":    //摇一摇事件通知
                        AroundBeacon aroundBeacon = new AroundBeacon();
                        FillEntityWithXml(aroundBeacon, new XDocument(root.Element(propName)));
                        prop.SetValue(entity, aroundBeacon, null);
                        break;

                    default:
                        prop.SetValue(entity, root.Element(propName).Value, null);
                        break;
                    }
                }
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 根据XML信息填充实实体
        /// </summary>
        /// <typeparam name="T">MessageBase为基类的类型,Response和Request都可以</typeparam>
        /// <param name="entity">实体</param>
        /// <param name="doc">XML</param>
        public static void FillEntityWithXml <T>(this T entity, XDocument doc) where T : /*MessageBase*/ class, new()
        {
            entity = entity ?? new T();
            var root = doc.Root;

            if (root == null)
            {
                return;//无法处理
            }

            var props = entity.GetType().GetProperties();

            foreach (var prop in props)
            {
                var propName = prop.Name;
                if (root.Element(propName) != null)
                {
                    switch (prop.PropertyType.Name)
                    {
                    //case "String":
                    //    goto default;
                    case "DateTime":
                    case "Int32":
                    case "Int64":
                    case "Double":
                    case "Nullable`1":     //可为空对象
                        EntityUtility.FillSystemType(entity, prop, root.Element(propName).Value);
                        break;

                    case "Boolean":
                        if (propName == "FuncFlag")
                        {
                            EntityUtility.FillSystemType(entity, prop, root.Element(propName).Value == "1");
                        }
                        else
                        {
                            goto default;
                        }
                        break;

                    //以下为枚举类型
                    case "RequestMsgType":
                        //已设为只读
                        //prop.SetValue(entity, MsgTypeHelper.GetRequestMsgType(root.Element(propName).Value), null);
                        break;

                    case "ResponseMsgType":     //Response适用
                        //已设为只读
                        //prop.SetValue(entity, MsgTypeHelper.GetResponseMsgType(root.Element(propName).Value), null);
                        break;

                    case "Event":
                        //已设为只读
                        //prop.SetValue(entity, EventHelper.GetEventType(root.Element(propName).Value), null);
                        break;

                    //以下为实体类型
                    case "List`1":     //List<T>类型,ResponseMessageNews适用
                    {
                        var genericArguments        = prop.PropertyType.GetGenericArguments();
                        var genericArgumentTypeName = genericArguments[0].Name;
                        if (genericArgumentTypeName == "Article")
                        {
                            //文章下属节点item
                            List <Article> articles = new List <Article>();
                            foreach (var item in root.Element(propName).Elements("item"))
                            {
                                var article = new Article();
                                FillEntityWithXml(article, new XDocument(item));
                                articles.Add(article);
                            }
                            prop.SetValue(entity, articles, null);
                        }
                        else if (genericArgumentTypeName == "Account")
                        {
                            List <CustomerServiceAccount> accounts = new List <CustomerServiceAccount>();
                            foreach (var item in root.Elements(propName))
                            {
                                var account = new CustomerServiceAccount();
                                FillEntityWithXml(account, new XDocument(item));
                                accounts.Add(account);
                            }
                            prop.SetValue(entity, accounts, null);
                        }
                        else if (genericArgumentTypeName == "PicItem")
                        {
                            List <PicItem> picItems = new List <PicItem>();
                            foreach (var item in root.Elements(propName).Elements("item"))
                            {
                                var    picItem   = new PicItem();
                                var    picMd5Sum = item.Element("PicMd5Sum").Value;
                                Md5Sum md5Sum    = new Md5Sum()
                                {
                                    PicMd5Sum = picMd5Sum
                                };
                                picItem.item = md5Sum;
                                picItems.Add(picItem);
                            }
                            prop.SetValue(entity, picItems, null);
                        }
                        else if (genericArgumentTypeName == "AroundBeacon")
                        {
                            List <AroundBeacon> aroundBeacons = new List <AroundBeacon>();
                            foreach (var item in root.Elements(propName).Elements("AroundBeacon"))
                            {
                                var aroundBeaconItem = new AroundBeacon();
                                FillEntityWithXml(aroundBeaconItem, new XDocument(item));
                                aroundBeacons.Add(aroundBeaconItem);
                            }
                            prop.SetValue(entity, aroundBeacons, null);
                        }
                        else if (genericArgumentTypeName == "CopyrightCheckResult_ResultList")        //RequestMessageEvent_MassSendJobFinish
                        {
                            List <CopyrightCheckResult_ResultList> resultList = new List <CopyrightCheckResult_ResultList>();
                            foreach (var item in root.Elements("ResultList").Elements("item"))
                            {
                                CopyrightCheckResult_ResultList resultItem = new CopyrightCheckResult_ResultList();
                                FillEntityWithXml(resultItem.item, new XDocument(item));
                                resultList.Add(resultItem);
                            }
                            prop.SetValue(entity, resultList, null);
                        }
                        break;
                    }

                    case "Music":    //ResponseMessageMusic适用
                        FillClassValue <Music>(entity, root, propName, prop);
                        break;

                    case "Image":    //ResponseMessageImage适用
                        FillClassValue <Image>(entity, root, propName, prop);
                        break;

                    case "Voice":    //ResponseMessageVoice适用
                        FillClassValue <Voice>(entity, root, propName, prop);
                        break;

                    case "Video":    //ResponseMessageVideo适用
                        FillClassValue <Video>(entity, root, propName, prop);
                        break;

                    case "ScanCodeInfo":    //扫码事件中的ScanCodeInfo适用
                        FillClassValue <ScanCodeInfo>(entity, root, propName, prop);
                        break;

                    case "SendLocationInfo":    //弹出地理位置选择器的事件推送中的SendLocationInfo适用
                        FillClassValue <SendLocationInfo>(entity, root, propName, prop);
                        break;

                    case "SendPicsInfo":    //系统拍照发图中的SendPicsInfo适用
                        FillClassValue <SendPicsInfo>(entity, root, propName, prop);
                        break;

                    case "ChosenBeacon":    //摇一摇事件通知
                        FillClassValue <ChosenBeacon>(entity, root, propName, prop);
                        break;

                    case "AroundBeacon":    //摇一摇事件通知
                        FillClassValue <AroundBeacon>(entity, root, propName, prop);
                        break;

                        #region RequestMessageEvent_MassSendJobFinish
                    case "CopyrightCheckResult":
                        FillClassValue <CopyrightCheckResult>(entity, root, propName, prop);
                        break;

                    case "CopyrightCheckResult_ResultList_Item":
                        FillClassValue <CopyrightCheckResult_ResultList_Item>(entity, root, "item", prop);
                        break;
                        #endregion

                    default:
                        var enumSuccess = false;
                        if (prop.PropertyType.IsEnum)
                        {
                            //未知的枚举类型
                            try
                            {
                                prop.SetValue(entity, Enum.Parse(prop.PropertyType, root.Element(propName).Value, true), null);
                                enumSuccess = true;
                            }
                            catch {
                            }
                        }

                        if (!enumSuccess)
                        {
                            prop.SetValue(entity, root.Element(propName).Value, null);
                        }
                        break;
                    }
                }
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 根据XML信息填充实实体
        /// </summary>
        /// <typeparam name="T">MessageBase为基类的类型,Response和Request都可以</typeparam>
        /// <param name="entity">实体</param>
        /// <param name="doc">XML</param>
        public static void FillEntityWithXml <T>(this T entity, XDocument doc) where T : /*MessageBase*/ class, new()
        {
            if (doc == null)
            {
                throw new ArgumentNullException(nameof(doc));
            }

            var root = doc.Root;

            if (doc.Root == null)
            {
                throw new ArgumentNullException(nameof(doc.Root));
            }

            if (entity == null)
            {
                throw new ArgumentNullException(nameof(entity));
            }

            //entity = entity ?? new T();

            var props = entity.GetType().GetProperties();

            foreach (var prop in props)
            {
                if (!prop.CanWrite)
                {
                    continue;//如果不可读则跳过
                }

                var propName = prop.Name;
                if (root.Element(propName) != null)
                {
                    switch (prop.PropertyType.Name)
                    {
                    //case "String":
                    //    goto default;
                    case "DateTime":
                    case "DateTimeOffset":
                    case "Int32":
                    case "Int64":
                    case "Double":
                    case "Nullable`1":     //可为空对象
                        EntityUtility.FillSystemType(entity, prop, root.Element(propName).Value);
                        break;

                    case "Boolean":
                        if (propName == "FuncFlag")
                        {
                            EntityUtility.FillSystemType(entity, prop, root.Element(propName).Value == "1");
                        }
                        else
                        {
                            goto default;
                        }
                        break;

                    //以下为枚举类型
                    case "RequestMsgType":
                        //已设为只读
                        //prop.SetValue(entity, MsgTypeHelper.GetRequestMsgType(root.Element(propName).Value), null);
                        break;

                    case "ResponseMsgType":     //Response适用
                        //已设为只读
                        //prop.SetValue(entity, MsgTypeHelper.GetResponseMsgType(root.Element(propName).Value), null);
                        break;

                    case "Event":
                        //已设为只读
                        //prop.SetValue(entity, EventHelper.GetEventType(root.Element(propName).Value), null);
                        break;

                    //以下为实体类型
                    case "List`1":     //List<T>类型,ResponseMessageNews适用
                    {
                        var genericArguments        = prop.PropertyType.GetGenericArguments();
                        var genericArgumentTypeName = genericArguments[0].Name;
                        if (genericArgumentTypeName == "Article")
                        {
                            //文章下属节点item
                            List <Article> articles = new List <Article>();
                            foreach (var item in root.Element(propName).Elements("item"))
                            {
                                var article = new Article();
                                FillEntityWithXml(article, new XDocument(item));
                                articles.Add(article);
                            }
                            prop.SetValue(entity, articles, null);
                        }
                        else if (genericArgumentTypeName == "Account")
                        {
                            List <CustomerServiceAccount> accounts = new List <CustomerServiceAccount>();
                            foreach (var item in root.Elements(propName))
                            {
                                var account = new CustomerServiceAccount();
                                FillEntityWithXml(account, new XDocument(item));
                                accounts.Add(account);
                            }
                            prop.SetValue(entity, accounts, null);
                        }
                        else if (genericArgumentTypeName == "PicItem")
                        {
                            List <PicItem> picItems = new List <PicItem>();
                            foreach (var item in root.Elements(propName).Elements("item"))
                            {
                                var    picItem   = new PicItem();
                                var    picMd5Sum = item.Element("PicMd5Sum").Value;
                                Md5Sum md5Sum    = new Md5Sum()
                                {
                                    PicMd5Sum = picMd5Sum
                                };
                                picItem.item = md5Sum;
                                picItems.Add(picItem);
                            }
                            prop.SetValue(entity, picItems, null);
                        }
                        else if (genericArgumentTypeName == "AroundBeacon")
                        {
                            List <AroundBeacon> aroundBeacons = new List <AroundBeacon>();
                            foreach (var item in root.Elements(propName).Elements("AroundBeacon"))
                            {
                                var aroundBeaconItem = new AroundBeacon();
                                FillEntityWithXml(aroundBeaconItem, new XDocument(item));
                                aroundBeacons.Add(aroundBeaconItem);
                            }
                            prop.SetValue(entity, aroundBeacons, null);
                        }
                        else if (genericArgumentTypeName == "CopyrightCheckResult_ResultList")        //RequestMessageEvent_MassSendJobFinish
                        {
                            List <CopyrightCheckResult_ResultList> resultList = new List <CopyrightCheckResult_ResultList>();
                            foreach (var item in root.Elements("ResultList").Elements("item"))
                            {
                                CopyrightCheckResult_ResultList resultItem = new CopyrightCheckResult_ResultList();
                                FillEntityWithXml(resultItem.item, new XDocument(item));
                                resultList.Add(resultItem);
                            }
                            prop.SetValue(entity, resultList, null);
                        }
                        //企业微信
                        else if (genericArguments[0].Name == "MpNewsArticle")
                        {
                            List <MpNewsArticle> mpNewsArticles = new List <MpNewsArticle>();
                            foreach (var item in root.Elements(propName))
                            {
                                var mpNewsArticle = new MpNewsArticle();
                                FillEntityWithXml(mpNewsArticle, new XDocument(item));
                                mpNewsArticles.Add(mpNewsArticle);
                            }
                            prop.SetValue(entity, mpNewsArticles, null);
                        }
                        break;
                    }

                    case "Music":    //ResponseMessageMusic适用
                        FillClassValue <Music>(entity, root, propName, prop);
                        break;

                    case "Image":    //ResponseMessageImage适用
                        FillClassValue <Image>(entity, root, propName, prop);
                        break;

                    case "Voice":    //ResponseMessageVoice适用
                        FillClassValue <Voice>(entity, root, propName, prop);
                        break;

                    case "Video":    //ResponseMessageVideo适用
                        FillClassValue <Video>(entity, root, propName, prop);
                        break;

                    case "ScanCodeInfo":    //扫码事件中的ScanCodeInfo适用
                        FillClassValue <ScanCodeInfo>(entity, root, propName, prop);
                        break;

                    case "SendLocationInfo":    //弹出地理位置选择器的事件推送中的SendLocationInfo适用
                        FillClassValue <SendLocationInfo>(entity, root, propName, prop);
                        break;

                    case "SendPicsInfo":    //系统拍照发图中的SendPicsInfo适用
                        FillClassValue <SendPicsInfo>(entity, root, propName, prop);
                        break;

                    case "ChosenBeacon":    //摇一摇事件通知
                        FillClassValue <ChosenBeacon>(entity, root, propName, prop);
                        break;

                    case "AroundBeacon":    //摇一摇事件通知
                        FillClassValue <AroundBeacon>(entity, root, propName, prop);
                        break;

                        #region 开放平台-小程序
                    case "ThirdFasteRegisterInfo":     //开放平台-小程序-快速注册
                        FillClassValue <ThirdFasteRegisterInfo>(entity, root, propName, prop);
                        break;
                        #endregion

                        #region RequestMessageEvent_MassSendJobFinish
                    case "CopyrightCheckResult":
                        FillClassValue <CopyrightCheckResult>(entity, root, propName, prop);
                        break;

                    case "CopyrightCheckResult_ResultList_Item":
                        FillClassValue <CopyrightCheckResult_ResultList_Item>(entity, root, "item", prop);
                        break;
                        #region 企业号

                        /* 暂时放在Work.dll中
                         *                      case "AgentType":
                         *                          {
                         *                              AgentType tp;
                         #if NET35
                         *                              try
                         *                              {
                         *                                  tp = (AgentType)Enum.Parse(typeof(AgentType), root.Element(propName).Value, true);
                         *                                  prop.SetValue(entity, tp, null);
                         *                              }
                         *                              catch
                         *                              {
                         *
                         *                              }
                         #else
                         *                              if (Enum.TryParse(root.Element(propName).Value, out tp))
                         *                              {
                         *                                  prop.SetValue(entity, tp, null);
                         *                              }
                         #endif
                         *                              break;
                         *                          }
                         *                      case "Receiver":
                         *                          {
                         *                              Receiver receiver = new Receiver();
                         *                              FillEntityWithXml(receiver, new XDocument(root.Element(propName)));
                         *                              prop.SetValue(entity, receiver, null);
                         *                              break;
                         *                          }
                         */
                        #endregion

                        #endregion

                    default:
                        var enumSuccess = false;
                        if (prop.PropertyType.IsEnum)
                        {
                            //未知的枚举类型
                            try
                            {
                                prop.SetValue(entity, Enum.Parse(prop.PropertyType, root.Element(propName).Value, true), null);
                                enumSuccess = true;
                            }
                            catch
                            {
                            }
                        }

                        if (!enumSuccess)
                        {
                            prop.SetValue(entity, root.Element(propName).Value, null);
                        }
                        break;
                    }
                }
            }
        }