Пример #1
0
        /// <summary>
        /// 获取缓存项,如果没有,将自动创建一个
        /// </summary>
        /// <param name="entityType">实体类类型</param>
        /// <returns></returns>
        public static EntityFields Item(Type entityType)
        {
            if (dict.ContainsKey(entityType.FullName))
            {
                return(dict[entityType.FullName]);
            }

            EntityFields ef = new EntityFields();

            if (ef.InitEntity(entityType)) //2015.2.5 修改
            {
                dict.Add(entityType.FullName, ef);
            }
            return(ef);
        }
Пример #2
0
        /// <summary>
        /// 获取属性的值,如果没有,将返回属性类型的默认值;注意该方法调用将发起属性获取事件 。
        /// </summary>
        /// <param name="propertyName"></param>
        /// <returns></returns>
        public object GetPropertyValueWithEvent(string propertyName)
        {
            EntityFields ef        = EntityFieldsCache.Item(this.GetType());
            string       fieldName = ef.GetPropertyField(propertyName);

            if (fieldName != null)
            {
                this.OnPropertyGeting(fieldName);
                object result = PropertyList(fieldName);
                if (result == null || result == DBNull.Value)
                {
                    Type propType = ef.GetPropertyType(fieldName);
                    result = Activator.CreateInstance(propType);//活动类型的默认值
                }
                return(result);
            }
            return(new ArgumentOutOfRangeException("不存在指定的属性名:" + propertyName));
        }
Пример #3
0
        /// <summary>
        /// 获取或者设置指定属性名称的值,属性名必须是一个PDF.NET实体类的属性(调用了getProperty 和 setProperty方法),不能是普通属性。
        /// 如果属性不存在,获取该属性值将为null,而设置该属性值将抛出异常。
        /// </summary>
        /// <param name="propertyName">属性名称</param>
        /// <returns></returns>
        public object this[string propertyName]
        {
            get
            {
                EntityFields ef        = EntityFieldsCache.Item(this.GetType());
                string       fieldName = ef.GetPropertyField(propertyName);
                if (fieldName != null)
                {
                    this.OnPropertyGeting(fieldName);
                    return(PropertyList(fieldName));
                }
                //获取虚拟的字段值
                return(PropertyList(propertyName));;
            }
            set
            {
                EntityFields ef        = EntityFieldsCache.Item(this.GetType());
                string       fieldName = ef.GetPropertyField(propertyName);

                if (fieldName != null)
                {
                    //如果是实体类基础定义的字段,必须检查设置的值得类型
                    //2017.5.5 增加类型相容转换处理,包括空字符串,可用于大批量文本数据导入情况
                    Type fieldType = ef.GetPropertyType(fieldName);
                    try
                    {
                        object Value = CommonUtil.ChangeType(value, fieldType);
                        this.setProperty(fieldName, Value);
                    }
                    catch (Exception ex)
                    {
                        throw new ArgumentException("实体类的属性字段" + propertyName + " 需要"
                                                    + fieldType.Name + " 类型的值,但准备赋予的值不是该类型!", ex);
                    }
                }
                else
                {
                    //设置虚拟的字段值
                    this.setProperty(propertyName, value);
                }
            }
        }
Пример #4
0
        /// <summary>
        /// 获取指定字段名对应的描述
        /// </summary>
        /// <param name="fieldName">字段名</param>
        /// <returns>字段描述</returns>
        public string GetFieldDescription(string fieldName)
        {
            int          index = -1;
            EntityFields ef    = EntityFieldsCache.Item(this.GetType());

            for (int i = 0; i < ef.Fields.Length; i++)
            {
                string s = ef.Fields[i];
                if (s == fieldName)
                {
                    index = i;
                    break;
                }
            }
            if (index == -1)
            {
                throw new ArgumentOutOfRangeException(fieldName + " 不在实体类定义的字段范围内。");
            }
            return(GetFieldDescriptions()[index]);
        }
Пример #5
0
        /// <summary>
        /// 获取或者设置指定属性名称的值,属性名必须是一个PDF.NET实体类的属性(调用了getProperty 和 setProperty方法),不能是普通属性。
        /// 如果属性不存在,获取该属性值将为null,而设置该属性值将抛出异常。
        /// </summary>
        /// <param name="propertyName">属性名称</param>
        /// <returns></returns>
        public object this[string propertyName]
        {
            get
            {
                EntityFields ef        = EntityFieldsCache.Item(this.GetType());
                string       fieldName = ef.GetPropertyField(propertyName);
                if (fieldName != null)
                {
                    this.OnPropertyGeting(fieldName);
                    return(PropertyList(fieldName));
                }
                //获取虚拟的字段值
                return(PropertyList(propertyName));;
            }
            set
            {
                EntityFields ef        = EntityFieldsCache.Item(this.GetType());
                string       fieldName = ef.GetPropertyField(propertyName);

                if (fieldName != null)
                {
                    //如果是实体类基础定义的字段,必须检查设置的值得类型
                    if (value != null)
                    {
                        Type fieldType = ef.GetPropertyType(fieldName);
                        if (value.GetType() != fieldType)
                        {
                            throw new ArgumentException("实体类的属性字段" + propertyName + " 需要"
                                                        + fieldType.Name + " 类型的值,但准备赋予的值不是该类型!");
                        }
                    }
                    this.setProperty(fieldName, value);
                }
                else
                {
                    //设置虚拟的字段值
                    this.setProperty(propertyName, value);
                }
            }
        }
Пример #6
0
        protected internal  static void  BinaryDeserializeCommon(BinaryReader br, EntityFields ef,EntityBase factEntity)
        {
            int flag = br.ReadInt32();
            if (flag != PdfNetSerialize.ENTITY_ITEM_FLAG)
                throw new Exception("反序列化错误:不是有效的实体类数据格式!");

            byte FieldFlag;
            for (int i = 0; i < factEntity.PropertyValues.Length; i++)
            {
                object obj = null;
                FieldFlag = br.ReadByte();
                if (FieldFlag == 0)
                {
                    obj = DBNull.Value;
                }
                else
                {
                    Type propertyType = ef.GetPropertyType(factEntity.PropertyNames[i]);
                    if (propertyType == null)
                        throw new Exception("PDF.NET实体类序列化错误:未知的实体属性类型,请检查实体类的属性和字段定义是否匹配。");

                    switch (propertyType.Name)
                    {
                        case "Int32": obj = br.ReadInt32(); break;
                        case "String":
                            obj = br.ReadString();//继续读一个字符串
                            break;
                        case "DateTime": obj = DateTime.FromBinary(br.ReadInt64()); break;
                        case "Int16": obj = br.ReadInt16(); break;
                        case "Int64": obj = br.ReadInt64(); break;
                        case "Single": obj = br.ReadSingle(); break;
                        case "Double": obj = br.ReadDouble(); break;
                        case "Decimal": obj = br.ReadDecimal(); break;
                        case "Boolean": obj = br.ReadBoolean(); break;
                        case "Byte": obj = br.ReadByte(); break;
                        case "Char": obj = br.ReadChar(); break;
                        case "Byte[]":
                            int length = br.ReadInt32();
                            if (length > 0)
                                obj = br.ReadBytes(length);
                            break;
                    }
                }
                
                factEntity.PropertyValues[i] = obj;
                if (FieldFlag == byte.MaxValue)
                {
                    break;//属性已经读取完成,不再处理当前实体的其它字段
                }
            }
        }
Пример #7
0
        /// <summary>
        /// 二进制序列化
        /// </summary>
        /// <param name="entity">实体类实例</param>
        /// <returns>字节数组</returns>
        public static byte[] BinarySerialize(EntityBase entity)
        {
            MemoryStream ms             = new MemoryStream();
            BinaryWriter bw             = new BinaryWriter(ms);
            Type         factEntityType = entity.GetType();
            EntityFields ef             = EntityFieldsCache.Item(factEntityType);
            byte         b;

            //写入实体类标记
            bw.Write(ENTITY_ITEM_FLAG);
            int length = entity.PropertyValues.Length - 1;

            for (int i = 0; i <= length; i++)
            {
                object obj = entity.PropertyValues[i];
                //if (obj == System.DBNull.Value) obj = null;//DBNull.Value在Convert 的时候会失败
                //为每个属性添加null标记
                if (obj == System.DBNull.Value || obj == null)
                {
                    b = 0;//NULL标记
                }
                else
                {
                    if (length == i)
                    {
                        b = byte.MaxValue;
                    }
                    else
                    {
                        b = 1;                                     //如果标志位为 byte.MaxValue ,则表示已经写入所有的属性字段,可用于以后添加实体属性但又要成功读取原有的记录
                    }
                }


                bw.Write(b); //写入标记
                if (b > 0)
                {
                    Type propertyType = ef.GetPropertyType(entity.PropertyNames[i]);
                    if (propertyType == null)
                    {
                        throw new Exception("PDF.NET实体类序列化错误:未知的实体属性类型,请检查实体类的属性和字段定义是否匹配。");
                    }

                    switch (propertyType.Name)
                    {
                    case "Int32":
                        bw.Write(Convert.ToInt32(obj)); break;

                    case "String":
                        bw.Write(Convert.ToString(obj));
                        break;

                    case "DateTime":
                        bw.Write(Convert.ToDateTime(obj).ToBinary());
                        break;

                    case "Int16": bw.Write(Convert.ToInt16(obj)); break;

                    case "Int64": bw.Write(Convert.ToInt64(obj)); break;

                    case "Single": bw.Write(Convert.ToSingle(obj)); break;

                    case "Double": bw.Write(Convert.ToDouble(obj)); break;

                    case "Decimal": bw.Write(Convert.ToDecimal(obj)); break;

                    case "Boolean": bw.Write(Convert.ToBoolean(obj)); break;

                    case "Byte": bw.Write(Convert.ToByte(obj)); break;

                    case "Char": bw.Write(Convert.ToChar(obj)); break;

                    case "Byte[]":
                        Byte[] buffer = (Byte[])obj;
                        bw.Write(buffer.Length);    //写入字节序列的长度
                        if (buffer.Length > 0)
                        {
                            bw.Write(buffer);
                        }
                        break;
                    }
                }
            }

            bw.Close();
            ms.Close();
            return(ms.ToArray());
        }
Пример #8
0
        protected internal static void  BinaryDeserializeCommon(BinaryReader br, EntityFields ef, EntityBase factEntity)
        {
            int flag = br.ReadInt32();

            if (flag != PdfNetSerialize.ENTITY_ITEM_FLAG)
            {
                throw new Exception("反序列化错误:不是有效的实体类数据格式!");
            }

            byte FieldFlag;

            for (int i = 0; i < factEntity.PropertyValues.Length; i++)
            {
                object obj = null;
                FieldFlag = br.ReadByte();
                if (FieldFlag == 0)
                {
                    obj = DBNull.Value;
                }
                else
                {
                    Type propertyType = ef.GetPropertyType(factEntity.PropertyNames[i]);
                    if (propertyType == null)
                    {
                        throw new Exception("PDF.NET实体类序列化错误:未知的实体属性类型,请检查实体类的属性和字段定义是否匹配。");
                    }

                    switch (propertyType.Name)
                    {
                    case "Int32": obj = br.ReadInt32(); break;

                    case "String":
                        obj = br.ReadString();    //继续读一个字符串
                        break;

                    case "DateTime": obj = DateTime.FromBinary(br.ReadInt64()); break;

                    case "Int16": obj = br.ReadInt16(); break;

                    case "Int64": obj = br.ReadInt64(); break;

                    case "Single": obj = br.ReadSingle(); break;

                    case "Double": obj = br.ReadDouble(); break;

                    case "Decimal": obj = br.ReadDecimal(); break;

                    case "Boolean": obj = br.ReadBoolean(); break;

                    case "Byte": obj = br.ReadByte(); break;

                    case "Char": obj = br.ReadChar(); break;

                    case "Byte[]":
                        int length = br.ReadInt32();
                        if (length > 0)
                        {
                            obj = br.ReadBytes(length);
                        }
                        break;
                    }
                }

                factEntity.PropertyValues[i] = obj;
                if (FieldFlag == byte.MaxValue)
                {
                    break;//属性已经读取完成,不再处理当前实体的其它字段
                }
            }
        }
Пример #9
0
        /// <summary>
        /// 获取缓存项,如果没有,将自动创建一个
        /// </summary>
        /// <param name="entityType">实体类类型</param>
        /// <returns></returns>
        public static EntityFields Item(Type entityType)
        {
            if (dict.ContainsKey(entityType.FullName))
                return dict[entityType.FullName];

            EntityFields ef = new EntityFields();
            if (ef.Init(entityType))
                dict.Add(entityType.FullName, ef);
            return ef;
        }