class DynamicAccessor { object obj; public Func Getter; public Action Setter; public DynamicAccessor(object obj, string propertyName) { this.obj = obj; DynamicMethod getter = new DynamicMethod("getter",typeof(object), new Type[] { typeof(object) }); WriteGetter(getter, propertyName); DynamicMethod setter = new DynamicMethod("setter", null, new Type[] { typeof(object), typeof(object) }); writeSetter(setter, propertyName); Getter = (Func)getter.CreateDelegate(typeof(Func)); Setter = (Action)setter.CreateDelegate(typeof(Action)); } private void writeSetter(DynamicMethod md, string propertyName) { var mi = obj.GetType().GetProperty(propertyName).SetMethod; var il = md.GetILGenerator(); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Callvirt, mi); il.Emit(OpCodes.Nop); il.Emit(OpCodes.Ret); } private void WriteGetter(DynamicMethod md, string propertyName) { var mi = obj.GetType().GetProperty(propertyName).GetMethod; var il = md.GetILGenerator(); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Callvirt, mi); il.Emit(OpCodes.Ret); } }