public void SetTemplate(JSWrapper elementWrapper, string name, JSFunction factory)
        {
            var          element = elementWrapper.As <Element>();
            PropertyInfo p       = element.GetType().GetProperty(name);

            p.SetValue(element, new DataTemplate(() => {
                try
                {
                    var ac  = (factory.Call(null) as JSValue).ToObject();
                    var eid = ac.GetJSPropertyValue("element");
                    var e   = JSWrapper.FromKey(eid.ToString()).As <View>();
                    return(new TemplateView
                    {
                        View = e,
                        SetBindingContext = (obj) =>
                        {
                            ac.SetJSPropertyValue("data", (Java.Lang.Object)obj);
                        }
                    });
                }
                catch (Exception ex) {
                    System.Diagnostics.Debug.WriteLine(ex);
                    throw;
                }
            }));
        }
        public void SetImport(JSWrapper elementWrapper, string name, JSFunction factory)
        {
            var element = elementWrapper.As <Element>();
            var d       = WAContext.GetImports(element);

            if (d == null)
            {
                d = new Dictionary <string, Func <Element> >();
                WAContext.SetImports(element, d);
            }
            d[name] = () => {
                var t  = WAContext.GetAtomControl(element);
                var jv = factory.Call((JSObject)t.Wrap(Engine)) as JSValue;
                return(JSWrapper.FromKey(jv.ToObject().GetJSPropertyValue("element").ToString()).As <Element>());
            };
        }
        public static object ToType(this JSValue value, Type type)
        {
            if (value != null)
            {
                if ((bool)value.IsNull() || (bool)(value.IsUndefined()))
                {
                    return(null);
                }
            }
            if (type == typeof(int))
            {
                if (value == null)
                {
                    return(0);
                }
                return(value.ToNumber().IntValue());
            }
            if (type == typeof(short))
            {
                if (value == null)
                {
                    return(0);
                }
                return(value.ToNumber().ShortValue());
            }
            if (type == typeof(float))
            {
                if (value == null)
                {
                    return(0);
                }
                return(value.ToNumber().FloatValue());
            }
            if (type == typeof(double))
            {
                if (value == null)
                {
                    return(0);
                }
                return(value.ToNumber().DoubleValue());
            }
            if (type == typeof(bool))
            {
                if (value == null)
                {
                    return(0);
                }
                return((bool)value.ToBoolean());
            }
            if (type == typeof(DateTime))
            {
                if (value == null)
                {
                    return(DateTime.MinValue);
                }
                return((value as JSDate).ToDateTime());
            }
            if (value == null)
            {
                return(null);
            }
            if (type == typeof(string))
            {
                return(value.ToString());
            }
            if (type == typeof(JSFunction) || type.IsSubclassOf(typeof(JSFunction)))
            {
                return(value.ToFunction());
            }
            if (type == typeof(JSWrapper))
            {
                return(JSWrapper.FromKey(value.ToString()));
            }

            if (value is JSArray j)
            {
                if (type == typeof(System.Collections.IEnumerable))
                {
                    return(new AtomEnumerable(j));
                }

                // type is IList...
                var list = Activator.CreateInstance(type) as System.Collections.IList;
                for (int i = 0; i < j.Size(); i++)
                {
                    Type itemType = type.GetGenericArguments()[0];
                    list[i] = (j.Get(i) as JSValue).ToType(itemType);
                }
                return(list);
            }
            if (type == typeof(JSObject))
            {
                return(value.ToObject());
            }
            if (type == typeof(JSValue) || type.IsSubclassOf(typeof(JSValue)))
            {
                return(value);
            }
            return(null);
        }