private List <DType> CreateBeanFields(DefBean bean, ExcelStream stream)
        {
            var list = new List <DType>();

            foreach (DefField f in bean.HierarchyFields)
            {
                try
                {
                    //string sep = f.Tags.TryGetValue("tag", out var s) ? s : null;
                    //if (string.IsNullOrWhiteSpace(sep))
                    //{
                    list.Add(f.CType.Apply(this, stream));
                    //}
                    //else
                    //{
                    //    list.Add(f.CType.Apply(this, new ExcelStream(stream.ReadCell(), sep)));
                    //}
                }
                catch (DataCreateException dce)
                {
                    dce.Push(bean, f);
                    throw;
                }
                catch (Exception e)
                {
                    var dce = new DataCreateException(e, stream.LastReadDataInfo);
                    dce.Push(bean, f);
                    throw dce;
                }
            }
            return(list);
        }
Beispiel #2
0
        public DType Accept(TBean type, XElement x, DefAssembly ass)
        {
            var bean = (DefBean)type.Bean;

            DefBean implBean;

            if (bean.IsAbstractType)
            {
                string subType = x.Attribute(DefBean.TYPE_NAME_KEY)?.Value;
                if (string.IsNullOrWhiteSpace(subType))
                {
                    throw new Exception($"bean:'{bean.FullName}'是多态,需要指定{DefBean.TYPE_NAME_KEY}属性.\n xml:{x}");
                }
                implBean = DataUtil.GetImplTypeByNameOrAlias(bean, subType);
            }
            else
            {
                implBean = bean;
            }

            var fields = new List <DType>();

            foreach (DefField f in implBean.HierarchyFields)
            {
                var      feles = x.Elements(f.Name);
                XElement fele  = feles.FirstOrDefault();
                if (fele == null)
                {
                    if (f.CType.IsNullable)
                    {
                        fields.Add(null);
                        continue;
                    }
                    throw new Exception($"字段:{f.Name} 缺失");
                }
                try
                {
                    fields.Add(f.CType.Apply(this, fele, ass));
                }
                catch (DataCreateException dce)
                {
                    dce.Push(implBean, f);
                    throw;
                }
                catch (Exception e)
                {
                    var dce = new DataCreateException(e, "");
                    dce.Push(bean, f);
                    throw dce;
                }
            }
            return(new DBean(type, implBean, fields));
        }
Beispiel #3
0
        public DType Accept(TBean type, JsonElement x, DefAssembly ass)
        {
            var bean = (DefBean)type.Bean;

            DefBean implBean;

            if (bean.IsAbstractType)
            {
                if (!x.TryGetProperty(DefBean.TYPE_NAME_KEY, out var typeNameProp))
                {
                    throw new Exception($"结构:'{bean.FullName}' 是多态类型,必须用 '{DefBean.TYPE_NAME_KEY}' 字段指定 子类名");
                }
                string subType = typeNameProp.GetString();
                implBean = DataUtil.GetImplTypeByNameOrAlias(bean, subType);
            }
            else
            {
                implBean = bean;
            }

            var fields = new List <DType>();

            foreach (DefField f in implBean.HierarchyFields)
            {
                if (x.TryGetProperty(f.Name, out var ele))
                {
                    if (ele.ValueKind == JsonValueKind.Null || ele.ValueKind == JsonValueKind.Undefined)
                    {
                        if (f.CType.IsNullable)
                        {
                            fields.Add(null);
                        }
                        else
                        {
                            throw new Exception($"结构:'{implBean.FullName}' 字段:'{f.Name}' 不能 null or undefined ");
                        }
                    }
                    else
                    {
                        try
                        {
                            fields.Add(f.CType.Apply(this, ele, ass));
                        }
                        catch (DataCreateException dce)
                        {
                            dce.Push(bean, f);
                            throw;
                        }
                        catch (Exception e)
                        {
                            var dce = new DataCreateException(e, "");
                            dce.Push(bean, f);
                            throw dce;
                        }
                    }
                }
                else if (f.CType.IsNullable)
                {
                    fields.Add(null);
                }
                else
                {
                    throw new Exception($"结构:'{implBean.FullName}' 字段:'{f.Name}' 缺失");
                }
            }
            return(new DBean(type, implBean, fields));
        }