ClrHelper.cs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. namespace Jint.Runtime.Interop;
  2. using Jint.Native;
  3. public class ClrHelper
  4. {
  5. private readonly InteropOptions _interopOptions;
  6. internal ClrHelper(InteropOptions interopOptions)
  7. {
  8. _interopOptions = interopOptions;
  9. }
  10. /// <summary>
  11. /// Call JsValue.ToString(), mainly for NamespaceReference.
  12. /// </summary>
  13. #pragma warning disable CA1822
  14. public JsValue ToString(JsValue value)
  15. #pragma warning restore CA1822
  16. {
  17. return value.ToString();
  18. }
  19. /// <summary>
  20. /// Cast `obj as ISomeInterface` to `obj`
  21. /// </summary>
  22. #pragma warning disable CA1822
  23. public JsValue Unwrap(ObjectWrapper obj)
  24. #pragma warning restore CA1822
  25. {
  26. return new ObjectWrapper(obj.Engine, obj.Target);
  27. }
  28. /// <summary>
  29. /// Cast `obj` to `obj as ISomeInterface`
  30. /// </summary>
  31. #pragma warning disable CA1822
  32. public JsValue Wrap(ObjectWrapper obj, TypeReference type)
  33. #pragma warning restore CA1822
  34. {
  35. if (!type.ReferenceType.IsInstanceOfType(obj.Target))
  36. {
  37. ExceptionHelper.ThrowTypeError(type.Engine.Realm, "Argument obj must be an instance of type");
  38. }
  39. return new ObjectWrapper(obj.Engine, obj.Target, type.ReferenceType);
  40. }
  41. /// <summary>
  42. /// Get `TypeReference(ISomeInterface)` from `obj as ISomeInterface`
  43. /// </summary>
  44. public JsValue TypeOf(ObjectWrapper obj)
  45. {
  46. MustAllowGetType();
  47. return TypeReference.CreateTypeReference(obj.Engine, obj.ClrType);
  48. }
  49. /// <summary>
  50. /// Cast `TypeReference(SomeClass)` to `ObjectWrapper(SomeClass)`
  51. /// </summary>
  52. public JsValue TypeToObject(TypeReference type)
  53. {
  54. MustAllowGetType();
  55. var engine = type.Engine;
  56. return engine.Options.Interop.WrapObjectHandler.Invoke(engine, type.ReferenceType, null) ?? JsValue.Undefined;
  57. }
  58. /// <summary>
  59. /// Cast `ObjectWrapper(SomeClass)` to `TypeReference(SomeClass)`
  60. /// </summary>
  61. public JsValue ObjectToType(ObjectWrapper obj)
  62. {
  63. MustAllowGetType();
  64. if (obj.Target is Type t)
  65. {
  66. return TypeReference.CreateTypeReference(obj.Engine, t);
  67. }
  68. else
  69. {
  70. ExceptionHelper.ThrowArgumentException("Must be an ObjectWrapper of Type", nameof(obj));
  71. }
  72. return JsValue.Undefined;
  73. }
  74. private void MustAllowGetType()
  75. {
  76. if (!_interopOptions.AllowGetType)
  77. {
  78. ExceptionHelper.ThrowInvalidOperationException("Invalid when Engine.Options.Interop.AllowGetType == false");
  79. }
  80. }
  81. }