internal void WriteSetPropertyValueMethod(System.Reflection.Emit.ILGenerator il) { var allProperties = Properties.Where(w => w.PropertySetter != null).ToArray(); var helper = new Helper.ILEmitter(this.GetType(), this.TypeBuilder, il); il.DeclareLocal(typeof(bool)); for (int i = 0; i < allProperties.Length; i++) { il.DeclareLocal(typeof(bool)); } helper.Nop(); helper.Ldarg1(); helper.Call(typeof(string), "IsNullOrWhiteSpace", typeof(string)); var label = helper.DefineLabel(); helper.BrFalse(label); var endlabel = helper.DefineLabel(); helper.Nop(); helper.Ldarg0(); helper.Call(typeof(object), "GetType"); helper.Ldarg1(); helper.Newobj(typeof(Exceptions.EmptyOrNullPropertyNameException), typeof(Type), typeof(string)); helper.Throw(); helper.MarkLabel(label); var mcallStringEquals = typeof(string).GetMethod("Equals", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static, null, new[] { typeof(string), typeof(string) }, null); var plabel = helper.DefineLabel(); foreach (var p in allProperties) { helper.MarkLabel(plabel); plabel = helper.DefineLabel(); helper.Ldarg1(); helper.LdStr(p.Name); helper.Call(mcallStringEquals); helper.BrFalse(plabel); helper.Nop(); helper.Ldarg0(); helper.Ldarg2(); helper.CastOrUnBox(p.Type); helper.Call(p.PropertySetter); helper.Nop(); helper.Nop(); helper.Br(endlabel); } helper.MarkLabel(plabel); helper.Nop(); helper.Ldarg0(); helper.Call(typeof(object), "GetType"); helper.Ldarg1(); helper.Newobj(typeof(Exceptions.PropertyNotFoundException), typeof(Type), typeof(string)); helper.Throw(); helper.MarkLabel(endlabel); helper.Ret(); }