Example #1
0
 /// <summary>
 /// 设置字段值
 /// </summary>
 /// <param name="target">拥有该成员的类实例</param>
 /// <param name="value">字段/属性值</param>
 private void Set(object target, object value)
 {
     if (_setter == null)
     {
         _setter = FieldAccessor.InitializeSetter(this.Member);
     }
     value = value ?? TypeUtils.GetNullValue(this.Member.FieldType);
     _setter(target, value);
 }
Example #2
0
 /// <summary>
 /// 设置属性值
 /// </summary>
 /// <param name="target">拥有该成员的类实例</param>
 /// <param name="value">字段/属性值</param>
 private void Set(object target, object value)
 {
     if (!this.Member.CanWrite)
     {
         throw new XFrameworkException("{0} is unwritable", base.FullName);
     }
     _setter = _setter ?? PropertyAccessor.InitializeSetter(this.Member);
     _setter(target, value ?? TypeUtils.GetNullValue(this.Member.PropertyType));
 }
Example #3
0
 /// <summary>
 /// 动态访问成员
 /// </summary>
 /// <param name="target">拥有该成员的类实例</param>
 /// <param name="parameters">字段/属性值</param>
 public override object Invoke(object target, params object[] parameters)
 {
     if (parameters != null && parameters.Length == 0)
     {
         // get
         object obj = Get(target);
         return(obj);
     }
     else
     {
         // set
         Set(target, parameters != null ? parameters[0] : TypeUtils.GetNullValue(base.CLRType));
         return(null);
     }
 }
Example #4
0
        /// <summary>
        /// 将 <see cref="IDataRecord"/> 上的当前行反序列化为实体
        /// </summary>
        /// <param name="prevModel">前一行数据</param>
        /// <param name="isThisLine">是否同一行数据</param>
        /// <returns></returns>
        internal object Deserialize(object prevModel, out bool isThisLine)
        {
            isThisLine = false;

            #region 基元类型

            if (_isPrimitive == null)
            {
                _isPrimitive = TypeUtils.IsPrimitiveType(_entityType) || _reader.GetName(0) == AppConst.AUTO_INCREMENT_NAME;
            }
            if (_isPrimitive.Value)
            {
                if (_reader.IsDBNull(0))
                {
                    return(TypeUtils.GetNullValue(_entityType));                     //default(T);
                }
                var obj = _reader.GetValue(0);
                if (obj.GetType() != _entityType)
                {
                    // fix#Nullable<T> issue
                    if (!_entityType.IsGenericType)
                    {
                        obj = Convert.ChangeType(obj, _entityType);
                    }
                    else
                    {
                        Type type2 = _entityType.GetGenericTypeDefinition();
                        if (type2 != typeof(Nullable <>))
                        {
                            throw new NotSupportedException(string.Format("type {0} not suppored.", type2.FullName));
                        }
                        obj = Convert.ChangeType(obj, Nullable.GetUnderlyingType(_entityType));
                    }
                }

                return(obj);
            }

            #endregion

            #region 动态类型

            if (_isDynamic)
            {
                ExpandoObject obj    = new ExpandoObject();
                var           result = ((IDictionary <string, object>)obj);
                for (int i = 0; i < _reader.FieldCount; i++)
                {
                    var value = _reader.GetValue(i);
                    if (value == DBNull.Value)
                    {
                        value = null;
                    }
                    result.Add(_reader.GetName(i), value);
                }
                return((dynamic)obj);
            }

            #endregion

            #region 实体类型

            object model = null;
            if (_map == null || _map.SelectedNavs == null || _map.SelectedNavs.Count == 0)
            {
                // 没有字段映射说明或者没有导航属性
                if (_entityDeserializer == null)
                {
                    _entityDeserializer = _deserializerImpl.GetTypeDeserializer(_entityType, _reader, _map != null ? _map.SelectedColumns : null, 0);
                }
                model = _entityDeserializer(_reader);
            }
            else
            {
                // 第一层
                if (_entityDeserializer == null)
                {
                    _entityDeserializer = _deserializerImpl.GetTypeDeserializer(_entityType, _reader, _map.SelectedColumns, 0, _map.SelectedNavs.MinIndex);
                }
                model = _entityDeserializer(_reader);
                // 若有 1:n 的导航属性,判断当前行数据与上一行数据是否相同
                if (prevModel != null && _map.HasMany)
                {
                    isThisLine = true;
                    foreach (var m in _typeRuntime.KeyMembers)
                    {
                        var value1 = m.Invoke(prevModel);
                        var value2 = m.Invoke(model);
                        isThisLine = isThisLine && value1.Equals(value2);
                        if (!isThisLine)
                        {
                            // Fix issue#换行时清空上一行的导航键缓存
                            _manyNavigationKeys.Clear();
                            break;
                        }
                    }
                }

                // 递归导航属性
                this.Deserialize_Navigation(isThisLine ? prevModel : null, model, string.Empty, isThisLine);
            }

            return(model);

            #endregion
        }