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)); }
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); }
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)); }
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)); }
public void Init() { infoProvider = new DelegatedTypeMappingInfoProvider(t => t.GetProperties()); }
public abstract T Build(ITypeMappingInfoProvider infoProvider);