// 导航属性 private static void ToModel_Navigation(object model, object[] values, CommandDefine_Select define, string typeName) { // CRM_SaleOrder.Client Type pType = model.GetType(); TypeRuntimeInfo runtime = TypeRuntimeInfoCache.GetRuntimeInfo(pType); if (string.IsNullOrEmpty(typeName)) { typeName = pType.Name; } foreach (var kvp in runtime.NavWrappers) { string keyName = typeName + "." + kvp.Key; ColumnNavDescriptor descriptor = null; define.NavDescriptors.TryGetValue(keyName, out descriptor); if (descriptor == null) { continue; } // 实例化这个导航属性并且给它赋值 var navWrapper = kvp.Value; Type navType = navWrapper.DataType; TypeRuntimeInfo navRuntime = TypeRuntimeInfoCache.GetRuntimeInfo(navType); object navModel = navRuntime.ConstructInvoker.Invoke(); if (descriptor.Count > 0) { int index = -1; foreach (var c_kvp in define.Columns) { index += 1; if (index < descriptor.Start) { continue; } if (index > (descriptor.Start + descriptor.Count)) { break; } object obj = values[index]; if (obj == DBNull.Value) { continue; } var wrapper = navRuntime.GetWrapper(c_kvp.Value.Name) as MemberAccessWrapper; if (wrapper != null) { SetProperty(navModel, wrapper, obj); } } } SetProperty(model, navWrapper, navModel); if (navRuntime.NavWrappers.Count > 0) { ToModel_Navigation(navModel, values, define, keyName); } } }
public TypeDeserializer(IDataRecord reader, CommandDefine_Select define) { _define = define; _reader = reader; _funcCache = new Dictionary <string, Func <IDataRecord, object> >(8); }