コード例 #1
0
        public override Func <T, int> Build(ITypeMappingInfoProvider infoProvider)
        {
            var instance   = typeof(T).Parameter("instance");
            var hashValues = from member in infoProvider.GetOperandMembers(typeof(T), typeof(T))
                             let memberValue = instance.GetPropertyOrFieldAsType <Object>(member.Name).Coalesce()
                                               select memberValue.HashCode();

            var aggregatedHash = hashValues.Aggregate((result, hash) => result.ExclusiveOr(hash));

            Trace.WriteLine(String.Format("Generated GetHash method for type {0}: {1}", typeof(T), aggregatedHash));

            return(aggregatedHash.CompileTo <Func <T, int> >(instance));
        }
コード例 #2
0
        public override Action<T, T> Build(ITypeMappingInfoProvider infoProvider)
        {
            var x = typeof(T).Parameter("source");
            var y = typeof(T).Parameter("target");

            var guardOfX = x.EqualTo((object)null).Then(new InvalidOperationException("source cannot be null.").Throw());
            var guardOfY = y.EqualTo((object)null).Then(new InvalidOperationException("target cannot be null.").Throw());

            var assignments = from member in infoProvider.GetOperandMembers(typeof(T), typeof(T))
                              let sourceValue = Expression.PropertyOrField(x, member.Name)
                              let target = Expression.PropertyOrField(y, member.Name)
                              select target.AssignFrom(sourceValue);

            var body = guardOfX.Concat(guardOfY).Concat(assignments).AsABlock();
            Trace.WriteLine(String.Format("Generated CopyTo method for type {0}: {1}", typeof(T), body));

            return body.CompileTo<Action<T, T>>(x, y);
        }
コード例 #3
0
        public override Func <T, T, bool> Build(ITypeMappingInfoProvider infoProvider)
        {
            var x = typeof(T).Parameter("x");
            var y = typeof(T).Parameter("y");
            var membersCompare = (from member in infoProvider.GetOperandMembers(typeof(T), typeof(T))
                                  let memberX = x.GetPropertyOrFieldAsType <Object>(member.Name)
                                                let memberY = y.GetPropertyOrFieldAsType <Object>(member.Name)
                                                              select memberX.EqualTo(memberY)).ToArray();

            if (membersCompare.Length == 0)
            {
                throw new InvalidOperationException(String.Format("Type {0} doesn't contain any member to compare.", typeof(T)));
            }

            var xEqualsY      = membersCompare.Aggregate((result, memberEqual) => result.AndAlso(memberEqual));
            var neitherIsNull = x.NotEqualTo(null).AndAlso(y.NotEqualTo(null));
            var equals        = Expression.Condition(x.ReferenceEqualTo(y), Expression.Constant(true), Expression.Condition(neitherIsNull, xEqualsY, Expression.Constant(false)));

            Trace.WriteLine(String.Format("Generated Equals method for type {0}: {1}", typeof(T), equals));

            return(equals.CompileTo <Func <T, T, bool> >(x, y));
        }
コード例 #4
0
ファイル: MapProperty.cs プロジェクト: hugogu/Reflection4Net
        public override Action <IDictionary <string, object>, T> Build(ITypeMappingInfoProvider infoProvider)
        {
            var obj = typeof(T).Parameter("obj");
            var map = typeof(IDictionary <string, object>).Parameter("map");

            var guardOfObj = obj.EqualTo((object)null).Then(new ArgumentNullException("obj can't be null.").Throw());
            var guardOfMap = map.EqualTo((object)null).Then(new ArgumentNullException("map can't be null.").Throw());

            var assignments = from member in infoProvider.GetOperandMembers(typeof(T), typeof(T))
                              let memberName = infoProvider.GetMemberNameMapping(typeof(T), typeof(T))(member)
                                               let valueConverter = infoProvider.GetTypeConverters(typeof(T), typeof(T))(member)
                                                                    let valueExpr = ReflectionUtils.GetDictionaryValueMethod.CallWith(map, Expression.Constant(memberName))
                                                                                    let sourceValue = ReflectionUtils.ConvertFromMethod.CallOn(Expression.Constant(valueConverter), valueExpr)
                                                                                                      let target = obj.GetPropertyOrField(memberName)
                                                                                                                   select target.AssignFrom(sourceValue.ConvertToType(member.GetMemberType()));

            var body = guardOfMap.Concat(guardOfObj).Concat(assignments).AsABlock();

            Trace.WriteLine(String.Format("Generated CopyTo method for type {0}: {1}", typeof(T), body));

            return(body.CompileTo <Action <IDictionary <string, object>, T> >(map, obj));
        }
コード例 #5
0
 public void Init()
 {
     infoProvider = new DelegatedTypeMappingInfoProvider(t => t.GetProperties());
 }
コード例 #6
0
 public abstract T Build(ITypeMappingInfoProvider infoProvider);