public void BeginSetMembers(CodeGenerator generator, ArgBuilder targetObject) { locMemberValues = generator.DeclareLocal(typeof(Dictionary<string, object>), "memberValues"); locDataTable = generator.DeclareLocal(typeof(DataTable), "dataTable"); generator.New(typeof(Dictionary<string, object>).GetConstructor(Type.EmptyTypes)); generator.Stloc(locMemberValues); generator.New(typeof(DataTable).GetConstructor(Type.EmptyTypes)); generator.Stloc(locDataTable); }
public void GetMemberValue(CodeGenerator generator, ArgBuilder targetObject, string memberName, ref LocalBuilder memberValue) { LocalBuilder locValue = generator.DeclareLocal(typeof(string)); Type targetType = memberValue.LocalType; Type originalType = ConvertorGeneratorHelper.GetOriginalType(targetType); generator.Ldarg(targetObject); generator.Load(memberName); generator.Call(typeof(NameValueCollection).GetMethod("get_Item", new Type[] { typeof(string) })); generator.Stloc(locValue); if (targetType.IsAssignableFrom(typeof(string))) { generator.Ldloc(locValue); generator.Stloc(memberValue); return; } else { generator.Ldloc(locValue); generator.Call(typeof(string).GetMethod("IsNullOrEmpty")); generator.Load(true); generator.If(Cmp.NotEqualTo); if (targetType == typeof(Guid)) { generator.Ldloc(locValue); generator.New(typeof(Guid).GetConstructor(new Type[] { typeof(string) })); generator.Stloc(memberValue); } else { MethodInfo parseMethod = targetType.GetMethod("Parse", new Type[] { typeof(string) }); if (parseMethod != null) { generator.Ldloc(locValue); generator.Call(parseMethod); generator.Stloc(memberValue); } else { generator.Ldloc(locValue); generator.Load(originalType); generator.Call(typeof(Convert).GetMethod("ChangeType", new Type[] { typeof(object), typeof(Type) })); if (targetType.IsValueType) { generator.UnboxAny(targetType); } generator.Stloc(memberValue); } } generator.Else(); generator.LoadDefaultValue(targetType); generator.Stloc(memberValue); generator.EndIf(); } }
public void GetMemberValue(CodeGenerator generator, ArgBuilder targetObject, string memberName, ref LocalBuilder memberValue) { LocalBuilder tempLocal = generator.DeclareLocal(typeof(object), "dataColumn"); Type targetType = memberValue.LocalType; Type originalType = ConvertorGeneratorHelper.GetOriginalType(targetType); generator.Ldarg(targetObject); generator.Load(memberName); generator.Call(typeof(DataRow).GetMethod("get_Item", new Type[] { typeof(string) })); generator.Stloc(tempLocal); generator.Ldloc(tempLocal); generator.LoadMember(typeof(DBNull).GetField("Value", BindingFlags.Static | BindingFlags.Public)); generator.If(Cmp.EqualTo); generator.LoadDefaultValue(targetType); generator.Stloc(memberValue); generator.Else(); generator.Ldloc(tempLocal); generator.InternalILGenerator.Emit(OpCodes.Isinst, targetType); generator.InternalILGenerator.Emit(OpCodes.Ldnull); generator.InternalILGenerator.Emit(OpCodes.Cgt_Un); generator.Load(true); generator.If(Cmp.EqualTo); generator.Ldloc(tempLocal); if (targetType.IsValueType) { generator.UnboxAny(targetType); } generator.Stloc(memberValue); generator.Else(); if (targetType == typeof(Guid)) { generator.Ldloc(tempLocal); generator.InternalILGenerator.Emit(OpCodes.Isinst, typeof(string)); generator.InternalILGenerator.Emit(OpCodes.Ldnull); generator.InternalILGenerator.Emit(OpCodes.Cgt_Un); generator.Load(true); generator.If(Cmp.EqualTo); generator.Ldloc(tempLocal); generator.New(typeof(Guid).GetConstructor(new Type[] { typeof(string) })); generator.Stloc(memberValue); } else { generator.Ldloc(tempLocal); generator.InternalILGenerator.Emit(OpCodes.Isinst, typeof(IConvertible)); generator.InternalILGenerator.Emit(OpCodes.Ldnull); generator.InternalILGenerator.Emit(OpCodes.Cgt_Un); generator.Load(true); generator.If(Cmp.EqualTo); generator.Ldloc(tempLocal); generator.Load(originalType); generator.Call(typeof(Convert).GetMethod("ChangeType", new Type[] { typeof(object), typeof(Type) })); if (targetType.IsValueType) { generator.UnboxAny(targetType); } generator.Stloc(memberValue); } generator.Else(); generator.LoadDefaultValue(targetType); generator.Stloc(memberValue); generator.EndIf(); generator.EndIf(); generator.EndIf(); }