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); }
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)); }
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); }