/// <summary>找到所引用的参考字段</summary> /// <param name="target"></param> /// <param name="member"></param> /// <param name="value"></param> /// <returns></returns> MemberInfoX FindReference(Object target, MemberInfo member, out Object value) { value = null; if (member == null) { return(null); } if (String.IsNullOrEmpty(ReferenceName)) { return(null); } // 考虑ReferenceName可能是圆点分隔的多重结构 MemberInfoX mx = null; Type type = member.DeclaringType; value = target; var ss = ReferenceName.Split("."); for (int i = 0; i < ss.Length; i++) { mx = MemberInfoX.Create(type, ss[i]); if (mx == null) { return(null); } // 最后一个不需要计算 if (i < ss.Length - 1) { type = mx.Type; value = mx.GetValue(value); } } //var mx = MemberInfoX.Create(member.DeclaringType, ReferenceName); //if (mx == null) return null; // 目标字段必须是整型 TypeCode tc = Type.GetTypeCode(mx.Type); if (tc >= TypeCode.SByte && tc <= TypeCode.UInt64) { return(mx); } return(null); }
/// <summary>设置目标对象的引用大小值</summary> /// <param name="target"></param> /// <param name="member"></param> /// <param name="encoding"></param> internal void SetReferenceSize(Object target, MemberInfo member, Encoding encoding) { Object v = null; var mx = FindReference(target, member, out v); if (mx == null) { return; } // 获取当前成员(加了特性)的值 var value = MemberInfoX.Create(member).GetValue(target); if (value == null) { return; } // 尝试计算大小 Int32 size = 0; if (value is String) { if (encoding == null) { encoding = Encoding.UTF8; } size = encoding.GetByteCount("" + value); } else if (value.GetType().IsArray) { size = (value as Array).Length; } else if (value is IEnumerable) { foreach (var item in value as IEnumerable) { size++; } } // 给参考字段赋值 mx.SetValue(v, size - Size); }