ReflectionDescriptor.cs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  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. var type = _reflectionAccessor.MemberType;
  29. return JsValue.FromObjectWithType(_engine, value, type);
  30. }
  31. set
  32. {
  33. try
  34. {
  35. _reflectionAccessor.SetValue(_engine, _target, value!);
  36. }
  37. catch (TargetInvocationException exception)
  38. {
  39. ExceptionHelper.ThrowMeaningfulException(_engine, exception);
  40. }
  41. }
  42. }
  43. }
  44. }