Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class DynamicAccessor
- {
- object obj;
- public Func<object, object> Getter;
- public Action<object, object> 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<object, object>)getter.CreateDelegate(typeof(Func<object, object>));
- Setter = (Action<object, object>)setter.CreateDelegate(typeof(Action<object, object>));
- }
- 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);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement