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); }
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; }
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; }