コード例 #1
0
        /// <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;
        }
コード例 #2
0
 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);
 }