using Jint.Native; namespace Jint.Runtime.Interop; #pragma warning disable IL2072 internal sealed class ClrHelper { private readonly Options.InteropOptions _interopOptions; internal ClrHelper(Options.InteropOptions interopOptions) { _interopOptions = interopOptions; } /// /// Call JsValue.ToString(), mainly for NamespaceReference. /// #pragma warning disable CA1822 public JsValue ToString(JsValue value) #pragma warning restore CA1822 { return value.ToString(); } /// /// Cast `obj as ISomeInterface` to `obj` /// #pragma warning disable CA1822 public JsValue Unwrap(ObjectWrapper obj) #pragma warning restore CA1822 { return ObjectWrapper.Create(obj.Engine, obj.Target); } /// /// Cast `obj` to `obj as ISomeInterface` /// #pragma warning disable CA1822 public JsValue Wrap(ObjectWrapper obj, TypeReference type) #pragma warning restore CA1822 { if (!type.ReferenceType.IsInstanceOfType(obj.Target)) { Throw.TypeError(type.Engine.Realm, "Argument obj must be an instance of type"); } return ObjectWrapper.Create(obj.Engine, obj.Target, type.ReferenceType); } /// /// Get `TypeReference(ISomeInterface)` from `obj as ISomeInterface` /// public JsValue TypeOf(ObjectWrapper obj) { MustAllowGetType(); return TypeReference.CreateTypeReference(obj.Engine, obj.ClrType); } /// /// Cast `TypeReference(SomeClass)` to `ObjectWrapper(SomeClass)` /// public JsValue TypeToObject(TypeReference type) { MustAllowGetType(); var engine = type.Engine; return engine.Options.Interop.WrapObjectHandler.Invoke(engine, type.ReferenceType, null) ?? JsValue.Undefined; } /// /// Cast `ObjectWrapper(SomeClass)` to `TypeReference(SomeClass)` /// public JsValue ObjectToType(ObjectWrapper obj) { MustAllowGetType(); if (obj.Target is Type t) { return TypeReference.CreateTypeReference(obj.Engine, t); } Throw.ArgumentException("Must be an ObjectWrapper of Type", nameof(obj)); return JsValue.Undefined; } private void MustAllowGetType() { if (!_interopOptions.AllowGetType) { Throw.InvalidOperationException("Invalid when Engine.Options.Interop.AllowGetType == false"); } } }