/// <summary> /// 访问成员 /// </summary> /// <param name="memberName">成员名称</param> /// <returns></returns> public object Invoke(object target, string memberName, params object[] parameters) { MemberInvokerBase invoker = null; this.Invokers.TryGetValue(memberName, out invoker); if (invoker == null) { throw new XFrameworkException("{0}.{1} Not Found.", _type.Name, memberName); } return(invoker.Invoke(target, parameters)); }
// 反序列化导航属性 // @prevLine 前一行数据 // @isLine 是否同一行数据<同一父级> void Deserialize_Navigation(object prevModel, object model, string typeName, bool isThisLine) { // CRM_SaleOrder.Client // CRM_SaleOrder.Client.AccountList Type type = model.GetType(); TypeRuntimeInfo typeRuntime = TypeRuntimeInfoCache.GetRuntimeInfo(type); if (string.IsNullOrEmpty(typeName)) { typeName = type.Name; } foreach (var kvp in _definition.Navigations) { int start = -1; int end = -1; var descriptor = kvp.Value; if (descriptor.FieldCount > 0) { start = descriptor.Start; end = descriptor.Start + descriptor.FieldCount; } string keyName = typeName + "." + descriptor.Name; if (keyName != kvp.Key) { continue; } var navInvoker = typeRuntime.GetInvoker(descriptor.Name); if (navInvoker == null) { continue; } Type navType = navInvoker.DataType; Func <IDataRecord, object> deserializer = null; TypeRuntimeInfo navTypeRuntime = TypeRuntimeInfoCache.GetRuntimeInfo(navType); object navCollection = null; //if (navType.IsGenericType && navTypeRuntime.GenericTypeDefinition == typeof(List<>)) if (TypeUtils.IsCollectionType(navType)) { // 1:n关系,导航属性为 List<T> navCollection = navInvoker.Invoke(model); if (navCollection == null) { // new 一个列表类型,如果导航属性定义为接口,则默认使用List<T>来实例化 TypeRuntimeInfo navTypeRuntime2 = navType.IsInterface ? TypeRuntimeInfoCache.GetRuntimeInfo(typeof(List <>).MakeGenericType(navTypeRuntime.GenericArguments[0])) : navTypeRuntime; navCollection = navTypeRuntime2.ConstructInvoker.Invoke(); navInvoker.Invoke(model, navCollection); } } if (!_deserializers.TryGetValue(keyName, out deserializer)) { deserializer = InternalTypeDeserializer.GetTypeDeserializer(navType.IsGenericType ? navTypeRuntime.GenericArguments[0] : navType, _reader, _definition.Columns, start, end); _deserializers[keyName] = deserializer; } // 如果整个导航链中某一个导航属性为空,则跳出递归 object navModel = deserializer(_reader); if (navModel != null) { if (navCollection == null) { // 非集合型导航属性 navInvoker.Invoke(model, navModel); // // // } else { // 集合型导航属性 if (prevModel != null && isThisLine) { #region 合并列表 // 判断如果属于同一个主表,则合并到上一行的当前明细列表 // 例:CRM_SaleOrder.Client.AccountList string[] keys = keyName.Split('.'); TypeRuntimeInfo curTypeRuntime = TypeRuntimeInfoCache.GetRuntimeInfo <T>(); Type curType = curTypeRuntime.Type; MemberInvokerBase curInvoker = null; object curModel = prevModel; for (int i = 1; i < keys.Length; i++) { curInvoker = curTypeRuntime.GetInvoker(keys[i]); curModel = curInvoker.Invoke(curModel); if (curModel == null) { continue; } curType = curModel.GetType(); curTypeRuntime = TypeRuntimeInfoCache.GetRuntimeInfo(curType); // <<<<<<<<<<< 一对多对多关系 >>>>>>>>>> if (curType.IsGenericType && i != keys.Length - 1) { curTypeRuntime = TypeRuntimeInfoCache.GetRuntimeInfo(curType); //if (curTypeRuntime.GenericTypeDefinition == typeof(List<>)) if (TypeUtils.IsCollectionType(curType)) { var invoker = curTypeRuntime.GetInvoker("get_Count"); int count = Convert.ToInt32(invoker.Invoke(curModel)); // List.Count if (count > 0) { var invoker2 = curTypeRuntime.GetInvoker("get_Item"); curModel = invoker2.Invoke(curModel, count - 1); // List[List.Count-1] curTypeRuntime = TypeRuntimeInfoCache.GetRuntimeInfo(curModel.GetType()); } else { // user.Roles.RoleFuncs=>Roles 列表有可能为空 curModel = null; break; } } } } if (curModel != null) { // 如果有两个以上的一对多关系的导航属性,那么在加入列表之前就需要剔除重复的实体 bool isAny = false; if (_definition.Navigations.Count > 1) { if (_listNavigationCount == null) { _listNavigationCount = _definition.Navigations.Count(x => CheckCollectionNavigation(x.Value.Member)); } if (_listNavigationCount != null && _listNavigationCount.Value > 1) { if (!_listNavigationKeys.ContainsKey(keyName)) { _listNavigationKeys[keyName] = new HashSet <string>(); } curTypeRuntime = TypeRuntimeInfoCache.GetRuntimeInfo(navModel.GetType()); StringBuilder keyBuilder = new StringBuilder(64); foreach (var key in curTypeRuntime.KeyInvokers) { var invoker = key.Value; var value = invoker.Invoke(navModel); keyBuilder.AppendFormat("{0}={1};", key.Key, (value ?? string.Empty).ToString()); } string hash = keyBuilder.ToString(); if (_listNavigationKeys[keyName].Contains(hash)) { isAny = true; } else { _listNavigationKeys[keyName].Add(hash); } } } if (!isAny) { // 如果列表中不存在,则添加到上一行的相同导航列表中去 var myAddMethod = navTypeRuntime.GetInvoker("Add"); myAddMethod.Invoke(curModel, navModel); } } #endregion } else { // 此时的 navTypeRuntime 是 List<> 类型的运行时 // 先添加 List 列表 var myAddMethod = navTypeRuntime.GetInvoker("Add"); myAddMethod.Invoke(navCollection, navModel); var curTypeRuntime = TypeRuntimeInfoCache.GetRuntimeInfo(navModel.GetType()); StringBuilder keyBuilder = new StringBuilder(64); foreach (var key in curTypeRuntime.KeyInvokers) { var wrapper = key.Value; var value = wrapper.Invoke(navModel); keyBuilder.AppendFormat("{0}={1};", key.Key, (value ?? string.Empty).ToString()); } string hash = keyBuilder.ToString(); if (!_listNavigationKeys.ContainsKey(keyName)) { _listNavigationKeys[keyName] = new HashSet <string>(); } if (!_listNavigationKeys[keyName].Contains(hash)) { _listNavigationKeys[keyName].Add(hash); } } } //if (navTypeRuntime.GenericTypeDefinition == typeof(List<>)) navTypeRuntime = TypeRuntimeInfoCache.GetRuntimeInfo(navTypeRuntime.GenericArguments[0]); if (TypeUtils.IsCollectionType(navTypeRuntime.Type)) { navTypeRuntime = TypeRuntimeInfoCache.GetRuntimeInfo(navTypeRuntime.GenericArguments[0]); } if (navTypeRuntime.NavInvokers.Count > 0) { Deserialize_Navigation(prevModel, navModel, keyName, isThisLine); } } } }