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