/// <inheritdoc/> public override void GenerateCode(Emit.MethodBodyGenerator generator, Emit.MethodCompileOption options) { Type = VariableType != null?VariableType.ResolveType(generator.Context) : TypeProvider.AnyType; if (Value != null) { var defValue = Value.Accept(generator); defValue.GenerateCode(generator, AssignOption); if (VariableType == null) { Type = defValue.Type; } else if (!TypeUtils.AreReferenceAssignable(Type, defValue.Type) && defValue.Type.TryImplicitConvert(Type, out System.Reflection.MethodInfo opConvert)) { // When converting value type to Any, must do Box if (defValue.Type.IsValueType && opConvert.GetParameters()[0].ParameterType.IsValueType == false) { generator.Box(defValue.Type); } generator.CallStatic(opConvert); } else if (defValue.Type.IsValueType && !Type.IsValueType) { generator.Box(defValue.Type); } } //initialize var variable = generator.DeclareVariable(Type, Name); generator.StoreVariable(variable); return; }
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); }