Esempio n. 1
0
        private Expression GetSwitchConstant(DeserializerTypeContext ctx, MemberNode node)
        {
            if (ctx.HashingMethod == null) return Expression.Constant(node.Member.Name);

              var hash = ctx.HashingMethod.Values.FirstOrDefault(kv => kv.Value == node.Member.Name);

              if (hash.Value == null) throw new InvalidOperationException("Unknown hash for member " + node.Member);

              return Expression.Constant(hash.Key);
        }
Esempio n. 2
0
        private SwitchCase ProcessCollectionNode(DeserializerTypeContext ctx, MemberNode node, MethodInfo method)
        {
            var bodyExpressions = new List<Expression>();

              var collectionType = GetNewCollectionType(node.Member.PropertyOrFieldType);

              method = method.MakeGenericMethod(collectionType);

              var createNewCollection = Expression.New(collectionType);

              var callExtractItems = Expression.Call(null, method, ctx.IteratorVar, ctx.StringParam, createNewCollection);

              var accessMember = Expression.MakeMemberAccess(ctx.InstanceVar, node.Member);

              if (node.Member.PropertyOrFieldType.IsArray)
              {
            var callToArray = Expression.Call(null, _toArray.MakeGenericMethod(node.Member.PropertyOrFieldType.GetElementType()), callExtractItems);
            callExtractItems = callToArray;
              }

              var assignMember = Expression.Assign(accessMember, callExtractItems);

              bodyExpressions.Add(assignMember);
              bodyExpressions.Add(Expression.Empty());

              var body = Expression.Block(bodyExpressions);

              var @case = Expression.SwitchCase(body, GetSwitchConstant(ctx, node));

              return @case;
        }
Esempio n. 3
0
        private SwitchCase GetKnownTypeSwitchCase(DeserializerTypeContext ctx, MethodInfo method, MemberNode node)
        {
            var bodyExpressions = new List<Expression>();

              var callExtractString = Expression.Call(null, method, ctx.IteratorVar, ctx.StringParam);

              var accessMember = Expression.MakeMemberAccess(ctx.InstanceVar, node.Member);

              var assignMember = Expression.Assign(accessMember, callExtractString);

              bodyExpressions.Add(assignMember);
              bodyExpressions.Add(Expression.Empty());

              var body = Expression.Block(bodyExpressions);

              var @case = Expression.SwitchCase(body, GetSwitchConstant(ctx, node));

              return @case;
        }