Advertisement
Guest User

Untitled

a guest
Oct 15th, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.33 KB | None | 0 0
  1. class DynamicAccessor
  2. {
  3. object obj;
  4. public Func<object, object> Getter;
  5. public Action<object, object> Setter;
  6. public DynamicAccessor(object obj, string propertyName)
  7. {
  8. this.obj = obj;
  9.  
  10. DynamicMethod getter = new DynamicMethod("getter",typeof(object), new Type[] { typeof(object) });
  11. WriteGetter(getter, propertyName);
  12. DynamicMethod setter = new DynamicMethod("setter", null, new Type[] { typeof(object), typeof(object) });
  13. writeSetter(setter, propertyName);
  14.  
  15. Getter = (Func<object, object>)getter.CreateDelegate(typeof(Func<object, object>));
  16. Setter = (Action<object, object>)setter.CreateDelegate(typeof(Action<object, object>));
  17. }
  18.  
  19. private void writeSetter(DynamicMethod md, string propertyName)
  20. {
  21. var mi = obj.GetType().GetProperty(propertyName).SetMethod;
  22.  
  23. var il = md.GetILGenerator();
  24. il.Emit(OpCodes.Ldarg_0);
  25. il.Emit(OpCodes.Ldarg_1);
  26. il.Emit(OpCodes.Callvirt, mi);
  27. il.Emit(OpCodes.Nop);
  28. il.Emit(OpCodes.Ret);
  29. }
  30.  
  31. private void WriteGetter(DynamicMethod md, string propertyName)
  32. {
  33. var mi = obj.GetType().GetProperty(propertyName).GetMethod;
  34.  
  35. var il = md.GetILGenerator();
  36. il.Emit(OpCodes.Ldarg_0);
  37. il.Emit(OpCodes.Callvirt, mi);
  38. il.Emit(OpCodes.Ret);
  39. }
  40. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement