Example #1
0
        public static void TestNesting()
        {
            Delegate ShowDelegate = EHandler.CreateMethod <ENull>((il) =>
            {
                EMethod methodInfoHelper = typeof(Console);

                EModel structModel = EModel.CreateModel <TestStruct>().UseDefaultConstructor();
                structModel.SProperty("Name", "Name1");
                structModel.SField("Age", 101);


                EModel nesting_classModel = EModel.CreateModel <TestClass>().UseDefaultConstructor();
                nesting_classModel.SProperty("Name", "Name2");
                nesting_classModel.SField("Age", 102);

                EModel classModel = EModel.CreateModel <TestClass>().UseDefaultConstructor();
                classModel.SProperty("Name", "Name");
                classModel.SField("Age", 10);
                classModel.SField("FieldNext", structModel);
                classModel.SProperty("PropertyNext", nesting_classModel);

                classModel.LField("FieldNext").LFieldValue("Age");
                methodInfoHelper.ExecuteMethod <int>("WriteLine");

                classModel.LField("FieldNext").LPropertyValue("Name");
                methodInfoHelper.ExecuteMethod <string>("WriteLine");

                classModel.LPropertyValue("PropertyNext").LFieldValue("Age");
                methodInfoHelper.ExecuteMethod <int>("WriteLine");

                classModel.LPropertyValue("PropertyNext").LPropertyValue("Name");
                methodInfoHelper.ExecuteMethod <string>("WriteLine");
            }).Compile();

            ((Action)ShowDelegate)();
        }
Example #2
0
        public static GetterDelegate GetterFunc(ClassStruction model, PropertyInfo info)
        {
            MethodInfo getter = info.GetGetMethod(true);

            if (getter == null || getter.IsPrivate || getter.GetParameters().Length > 0)
            {
                return(null);
            }
            return((GetterDelegate)(EHandler.CreateMethod <object, object>((til) =>
            {
                LocalBuilder builder = null;
                if (!getter.IsStatic)
                {
                    builder = til.DeclareLocal(model.TypeHandler);
                    til.REmit(OpCodes.Ldarg_0);
                    til.UnPacket(model.TypeHandler);
                    til.REmit(OpCodes.Stloc_S, builder.LocalIndex);
                }
                EModel localModel = EModel.CreateModelFromBuilder(builder, model.TypeHandler);
                localModel.LPropertyValue(info.Name).Packet();
            }, "Getter " + info.DeclaringType.Name + " " + info.Name).Compile(typeof(GetterDelegate))));
        }
Example #3
0
        public static void Create(Type TypeHandler)
        {
            Delegate func = EHandler.CreateMethod <object, bool>((il) =>
            {
                LocalBuilder builder = il.DeclareLocal(TypeHandler);
                il.REmit(OpCodes.Ldarg_0);
                il.REmit(OpCodes.Unbox_Any, TypeHandler);
                il.REmit(OpCodes.Stloc_S, builder);

                EVar returnTrueResult  = true;
                EVar returnFalseResult = false;


                EModel model = EModel.CreateModelFromBuilder(builder, TypeHandler);
                #region Property
                Dictionary <string, PropertyInfo> properties = model.Struction.Properties;
                foreach (var item in properties)
                {
                    DebugHelper.WriteLine("检测" + item.Key + "是否为默认值:");
                    Type type = item.Value.PropertyType;
                    if (type.IsValueType && type.IsPrimitive)
                    {
                        EJudge.If(EDefault.IsDefault(type, () => { model.LPropertyValue(item.Key); }))(() =>
                        {
                        }).Else(() =>
                        {
                            MethodHelper.ReturnValue(false);
                        });
                    }
                    else if (type.IsClass)
                    {
                        EJudge.If(ENull.IsNull(() => { model.LPropertyValue(item.Key); }))(() =>
                        {
                        }).Else(() =>
                        {
                            MethodHelper.ReturnValue(false);
                        });
                    }
                }
                #endregion
                #region Fields
                Dictionary <string, FieldInfo> fields = model.Struction.Fields;
                foreach (var item in fields)
                {
                    DebugHelper.WriteLine("检测" + item.Key + "是否为默认值:");
                    Type type = item.Value.FieldType;
                    if (type.IsValueType && type.IsPrimitive)
                    {
                        EJudge.If(EDefault.IsDefault(type, model.DLoadValue(item.Key).DelayAction))(() =>
                        {
                        }).Else(() =>
                        {
                            MethodHelper.ReturnValue(false);
                        });
                    }
                    else if (type.IsClass)
                    {
                        EJudge.If(ENull.IsNull(model.DLoadValue(item.Key).DelayAction))(() =>
                        {
                        }).Else(() =>
                        {
                            MethodHelper.ReturnValue(false);
                        });
                    }
                }
                #endregion
                il.EmitBoolean(true);
            }, "Check").Compile(typeof(CheckStructDelegate));

            ClassCache.CheckStructDict[TypeHandler] = (CheckStructDelegate)func;
        }