Esempio n. 1
0
        public static void RegisterProxyConverter <T>(this IJSValueConverterService service, Action <JSValueBinding, T, IServiceNode> createBinding) where T : class
        {
            toJSValueDelegate <T> tojs = (IServiceNode node, T value) =>
            {
                return(node.GetService <IContextSwitchService>().With(() =>
                {
                    var result = JavaScriptValue.CreateExternalObject(IntPtr.Zero, null);
                    JSValueBinding binding = new JSValueBinding(node, result);
                    var handle = node.GetService <IGCSyncService>().SyncWithJsValue(value, result);
                    result.ExternalData = GCHandle.ToIntPtr(handle);//save the object reference to javascript values's external data
                    createBinding?.Invoke(binding, value, node);
                    return result;
                }));
            };
            fromJSValueDelegate <T> fromjs = (IServiceNode node, JavaScriptValue value) =>
            {
                if (value.HasExternalData)
                {
                    GCHandle handle = GCHandle.FromIntPtr(value.ExternalData);
                    return(handle.Target as T);
                }
                else
                {
                    throw new ArgumentOutOfRangeException("Convert from jsValue to proxy object failed, jsValue does not have a linked CLR object");
                }
            };

            service.RegisterConverter <T>(tojs, fromjs);
        }
Esempio n. 2
0
        public static void RegisterProxyConverter <T>(this IJSValueConverterService service, Action <JSValueBinding, T, IServiceNode> createBinding) where T : class
        {
            toJSValueDelegate <T> tojs = (IServiceNode node, T value) =>
            {
                var mapService = node.GetService <IProxyMapService>();
                return(mapService.Map <T>(value, createBinding));
            };
            fromJSValueDelegate <T> fromjs = (IServiceNode node, JavaScriptValue value) =>
            {
                var mapService = node.GetService <IProxyMapService>();
                return(mapService.Get <T>(value));
            };

            service.RegisterConverter <T>(tojs, fromjs);
        }
 public void RegisterConverter <T>(toJSValueDelegate <T> toJSValue, fromJSValueDelegate <T> fromJSValue, bool throewIfExists = true)
 {
     if (CanConvert <T>())
     {
         if (throewIfExists)
         {
             throw new ArgumentException($"type {typeof(T).FullName} already registered");
         }
         else
         {
             return;
         }
     }
     converters.Add(typeof(T), new Tuple <object, object>(toJSValue, fromJSValue));
 }
Esempio n. 4
0
        public static void RegisterArrayConverter <T>(this IJSValueConverterService service)
        {
            toJSValueDelegate <IEnumerable <T> > tojs = (node, value) =>
            {
                return(node.WithContext <JavaScriptValue>(() =>
                {
                    var result = node.GetService <IJSValueService>().CreateArray(Convert.ToUInt32(value.Count()));
                    int index = 0;
                    foreach (T item in value)
                    {
                        result.SetIndexedProperty(service.ToJSValue <int>(index++), service.ToJSValue <T>(item));
                    }
                    return result;
                }
                                                          ));
            };
            fromJSValueDelegate <IEnumerable <T> > fromjs = (node, value) =>
            {
                return(node.WithContext <IEnumerable <T> >(() =>
                {
                    var jsValueService = node.GetService <IJSValueService>();
                    var length = service.FromJSValue <int>(value.GetProperty(JavaScriptPropertyId.FromString("length")));
                    List <T> result = new List <T>(length);//copy the data to avoid context switch in user code
                    for (int i = 0; i < length; i++)
                    {
                        result.Add(
                            service.FromJSValue <T>(value.GetIndexedProperty(
                                                        service.ToJSValue <int>(i))
                                                    )
                            );
                    }
                    return result;
                }
                                                           ));
            };

            service.RegisterConverter <IEnumerable <T> >(tojs, fromjs, false);
        }