/// <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); }
/// <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)); }
/// <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); } }
/// <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 }