private void InitSerializeFieldsDelegate(Type type) { Dictionary <string, MemberInfo> fields = HproseHelper.GetFields(type); DynamicMethod dynamicMethod = new DynamicMethod("$SerializeFields", typeofVoid, typeofArgs, type, true); ILGenerator gen = dynamicMethod.GetILGenerator(); LocalBuilder value = gen.DeclareLocal(typeofObject); LocalBuilder e = gen.DeclareLocal(typeofException); foreach (KeyValuePair <string, MemberInfo> field in fields) { FieldInfo fieldInfo = (FieldInfo)field.Value; Label exTryCatch = gen.BeginExceptionBlock(); if (type.IsValueType) { gen.Emit(OpCodes.Ldarg_0); gen.Emit(OpCodes.Unbox, type); } else { gen.Emit(OpCodes.Ldarg_0); } gen.Emit(OpCodes.Ldfld, fieldInfo); if (fieldInfo.FieldType.IsValueType) { gen.Emit(OpCodes.Box, fieldInfo.FieldType); } gen.Emit(OpCodes.Stloc_S, value); gen.Emit(OpCodes.Leave_S, exTryCatch); gen.BeginCatchBlock(typeofException); gen.Emit(OpCodes.Stloc_S, e); gen.Emit(OpCodes.Ldstr, "The field value can\'t be serialized."); gen.Emit(OpCodes.Ldloc_S, e); gen.Emit(OpCodes.Newobj, hproseExceptionCtor); gen.Emit(OpCodes.Throw); gen.Emit(OpCodes.Leave_S, exTryCatch); gen.EndExceptionBlock(); gen.Emit(OpCodes.Ldarg_1); gen.Emit(OpCodes.Ldloc_S, value); gen.Emit(OpCodes.Call, serializeMethod); } gen.Emit(OpCodes.Ret); serializeFieldsDelegate = (SerializeDelegate)dynamicMethod.CreateDelegate(typeofSerializeDelegate); }
protected override void InitUnserializeDelegate(Type type, string[] names, DynamicMethod dynamicMethod) { Dictionary <string, FieldTypeInfo> fields = HproseHelper.GetFields(type); ILGenerator gen = dynamicMethod.GetILGenerator(); LocalBuilder e = gen.DeclareLocal(typeofException); int count = names.Length; for (int i = 0; i < count; ++i) { FieldTypeInfo field; if (fields.TryGetValue(names[i], out field)) { Label exTryCatch = gen.BeginExceptionBlock(); if (type.IsValueType) { gen.Emit(OpCodes.Ldarg_0); gen.Emit(OpCodes.Unbox, type); } else { gen.Emit(OpCodes.Ldarg_0); } gen.Emit(OpCodes.Ldarg_1); gen.Emit(OpCodes.Ldc_I4, i); gen.Emit(OpCodes.Ldelem_Ref); if (field.type.IsValueType) { gen.Emit(OpCodes.Unbox_Any, field.type); } gen.Emit(OpCodes.Stfld, field.info); gen.Emit(OpCodes.Leave_S, exTryCatch); gen.BeginCatchBlock(typeofException); gen.Emit(OpCodes.Stloc_S, e); gen.Emit(OpCodes.Ldstr, "The field value can\'t be unserialized."); gen.Emit(OpCodes.Ldloc_S, e); gen.Emit(OpCodes.Newobj, hproseExceptionCtor); gen.Emit(OpCodes.Throw); gen.Emit(OpCodes.Leave_S, exTryCatch); gen.EndExceptionBlock(); } } gen.Emit(OpCodes.Ret); }