public override void GenerateCode(Emit.MethodBodyGenerator generator, Emit.MethodCompileOption option) { generator.NewObject(ReflectionHelpers.AnonymousObj); for (int i = 0; i < Members.Count; i++) { var member = Members[i]; generator.Duplicate(); generator.LoadString(member.Name); member.Expression.GenerateCode(generator, AssignOption); if (member.Expression.Type.IsValueType) { generator.Box(member.Expression.Type); } generator.CallVirtual(ReflectionHelpers.AnonymousObj_SetItem); } generator.NewObject(ReflectionHelpers.Any_New); }
public override void GenerateCode(Emit.MethodBodyGenerator generator, Emit.MethodCompileOption option) { Left.GenerateCode(generator); generator.Duplicate(); var end = generator.CreateLabel(); if (Left.Type.IsValueType) { if (Left.Type.TryImplicitConvert(TypeProvider.BooleanType, out System.Reflection.MethodInfo op_Implicit)) { generator.CallStatic(op_Implicit); generator.CallStatic(Utils.ReflectionHelpers.BoooleanToBool); } else { throw new System.InvalidCastException($"Unable to cast object of type {Left.Type} to {TypeProvider.BooleanType}"); } } generator.BranchIfTrue(end); generator.Pop(); Right.GenerateCode(generator, Emit.MethodCompileOption.Dupplicate); generator.DefineLabelPosition(end); }