コード例 #1
0
        public override IObjectState UpdateImpl(IObjectDataMember objectDataMember)
        {
            var eqExpression = Expression.Equal(objectDataMember.GetValueExpression(_left), objectDataMember.GetValueExpression(_right));
            var result       = Expression.AndAlso(_expression, eqExpression);

            return(new EqualityObjectState(result, _left, _right));
        }
コード例 #2
0
        public override IObjectState UpdateImpl(IObjectDataMember objectDataMember)
        {
            var tabExpression  = Constant(Tab);
            var callExpression = MakeIndentExpression(Call(StringConcat2StringsMethod, tabExpression,
                                                           Call(objectDataMember.GetValueExpression(_Target), GetToStringMethodInfo(objectDataMember))));
            Expression memberNameExpression = Constant(objectDataMember.MemberName + " :");
            var        endOfLineExpression  = Constant(NewLine);
            var        typeExpression       = objectDataMember.Walker.CanExpand(objectDataMember.MemberType) && Nullable.GetUnderlyingType(objectDataMember.MemberType) == null
                ? Call(StringConcat2StringsMethod, Constant($"{Tab}<{objectDataMember.MemberType.Name}>"), endOfLineExpression)
                : null;

            if (typeExpression != null)
            {
                memberNameExpression = Call(StringConcat2StringsMethod, memberNameExpression, typeExpression);
            }

            if (Nullable.GetUnderlyingType(objectDataMember.MemberType) != null || !objectDataMember.MemberType.IsValueType)
            {
                callExpression = Condition(NotEqual(objectDataMember.GetValueExpression(_Target),
                                                    Constant(null, objectDataMember.MemberType)), callExpression, Constant($"{Tab}(null){NewLine}"));
            }
            var lineExpression        = Call(StringConcat2StringsMethod, memberNameExpression, callExpression);
            var concatLinesExpression = Call(StringConcat2StringsMethod, _Expression, lineExpression);

            return(new ToStringObjectState(concatLinesExpression, _Target));
        }
コード例 #3
0
 public IObjectState Update(IObjectDataMember objectDataMember)
 {
     if (!CanUpdate(objectDataMember))
     {
         return(this);
     }
     return(UpdateImpl(objectDataMember));
 }
コード例 #4
0
        private bool CanUpdate(IObjectDataMember objectDataMember)
        {
            var typeEnable   = GetEnable(objectDataMember.DeclaringType);
            var memberEnable = CheckEnable(objectDataMember.GetCustomAttributes <EnableAttributeBase>());

            if (!typeEnable.HasValue && !memberEnable.HasValue)
            {
                return(true);
            }

            return(memberEnable.HasValue ? memberEnable : typeEnable);
        }
コード例 #5
0
        public override IObjectState UpdateImpl(IObjectDataMember objectDataMember)
        {
            var targetMember = objectDataMember.GetValueExpression(_target);
            var leftMember   = objectDataMember.GetValueExpression(_left);
            var rightMember  = objectDataMember.GetValueExpression(_right);

            var test   = Expression.NotEqual(Expression.Default(objectDataMember.MemberType), leftMember);
            var assign = Expression.Assign(targetMember, Expression.Condition(test, leftMember, rightMember));

            _expressions.Add(assign);

            return(new MergeObjectState(_expressions, _target, _left, _right, _type));
        }
コード例 #6
0
        public override IObjectState UpdateImpl(IObjectDataMember objectDataMember)
        {
            Expression callExpression = Expression.Call(objectDataMember.GetValueExpression(_Target), GetHashCodeMethodInfo(objectDataMember));

            if (Nullable.GetUnderlyingType(objectDataMember.MemberType) != null || !objectDataMember.MemberType.IsValueType)
            {
                callExpression = Expression.Condition(Expression.NotEqual(objectDataMember.GetValueExpression(_Target),
                                                                          Expression.Constant(null, objectDataMember.MemberType)), callExpression, Expression.Constant(0));
            }
            var multExpression = Expression.Multiply(_Expression, Expression.Constant(23));
            var addExpression  = Expression.Add(multExpression, callExpression);

            return(new GetHashCodeObjectState(addExpression, _Target));
        }
コード例 #7
0
 private IObjectState ProcessCollection(IObjectState state, IObjectDataMember member)
 {
     throw new NotSupportedException();
 }
コード例 #8
0
 private IObjectState ProcessMember(IObjectState state, IObjectDataMember member)
 {
     return(typeof(Enumerable).IsAssignableFrom(member.MemberType)
         ? ProcessCollection(state, member)
         : _visitor.Visit(state, member));
 }
コード例 #9
0
 public IObjectState Visit(IObjectState state, IObjectDataMember objectDataMember) => state.Update(objectDataMember);
コード例 #10
0
 private MethodInfo GetHashCodeMethodInfo(IObjectDataMember objectDataMember) =>
 typeof(object).GetMethod(nameof(GetHashCode));
コード例 #11
0
 public abstract IObjectState UpdateImpl(IObjectDataMember objectDataMember);
コード例 #12
0
 private MethodInfo GetToStringMethodInfo(IObjectDataMember objectDataMember) =>
 typeof(object).GetMethods().First(x => x.Name == nameof(ToString) && !x.GetParameters().Any());