2
0

ReflectionDescriptor.cs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. using System.Reflection;
  2. using Jint.Native;
  3. using Jint.Runtime.Interop.Reflection;
  4. namespace Jint.Runtime.Descriptors.Specialized
  5. {
  6. internal sealed class ReflectionDescriptor : PropertyDescriptor
  7. {
  8. private readonly Engine _engine;
  9. private readonly ReflectionAccessor _reflectionAccessor;
  10. private readonly object _target;
  11. public ReflectionDescriptor(
  12. Engine engine,
  13. ReflectionAccessor reflectionAccessor,
  14. object target,
  15. bool enumerable)
  16. : base((enumerable ? PropertyFlag.Enumerable : PropertyFlag.None) | PropertyFlag.CustomJsValue)
  17. {
  18. _engine = engine;
  19. _reflectionAccessor = reflectionAccessor;
  20. _target = target;
  21. Writable = reflectionAccessor.Writable && engine.Options.Interop.AllowWrite;
  22. }
  23. protected internal override JsValue? CustomValue
  24. {
  25. get
  26. {
  27. var value = _reflectionAccessor.GetValue(_engine, _target);
  28. return JsValue.FromObject(_engine, value);
  29. }
  30. set
  31. {
  32. try
  33. {
  34. _reflectionAccessor.SetValue(_engine, _target, value!);
  35. }
  36. catch (TargetInvocationException exception)
  37. {
  38. ExceptionHelper.ThrowMeaningfulException(_engine, exception);
  39. }
  40. }
  41. }
  42. }
  43. }