public override (Expression, ExpressionConversionResult) Convert(Esprima.Ast.ObjectExpression objectExpression, ExpressionConverterContext context, ExpressionConverterScope scope, bool allowTerminal, params Type[] genericArguments)
        {
            if (scope.TargetType != null)
            {
                var code = context.Source.Substring(objectExpression.Range.Start, objectExpression.Range.End - objectExpression.Range.Start + 1);
                using (var reader = new StringReader(code)) {
                    var @object = JsonSerializer.Deserialize(reader, scope.TargetType);
                    return(Expression.Constant(@object), DefaultResult);
                }
            }
            var propertyValueExpressions = objectExpression.Properties.Select(property => new {
                Property        = property,
                ValueExpression = context.ExpressionConverterResolver.Convert(property.Value, context, scope, false)
            }).ToArray();
            var  tuples        = propertyValueExpressions.Select(propertyValueExpression => new Tuple <Type, string>(propertyValueExpression.ValueExpression.Type, ((Esprima.Ast.Identifier)propertyValueExpression.Property.Key).Name)).ToArray();
            var  set           = new HashSet <Tuple <Type, string> >(tuples);
            Type anonymousType = null;

            if (!Cache.TryGetValue(set, out anonymousType))
            {
                anonymousType = AnonymousTypeBuilder.BuildAnonymousType(set);
                Cache[set]    = anonymousType;
            }
            var newExpression            = Expression.New(anonymousType.GetConstructor(new Type[0]));
            var initializationExpression = Expression.MemberInit(
                newExpression,
                propertyValueExpressions.Select(pve => Expression.Bind(anonymousType.GetProperty(((Esprima.Ast.Identifier)pve.Property.Key).Name), pve.ValueExpression))
                );

            return(initializationExpression, DefaultResult);
        }
Exemple #2
0
        public void WriteAssemblyToFileForDebugging()
        {
            var tb  = new AnonymousTypeBuilder(new[] { "Foo", "Bar" });
            var def = tb.BuildAnonymousType();

            def.Module.Assembly.Write("tempasm.dll");

            Assert.Fail("TODO: Remove me");
        }