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