Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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);
        }