Esempio n. 1
0
        /// <summary>
        /// [临时方案] 直接载入所有绑定类型
        /// </summary>
        public void Warmup(ScriptContext context)
        {
            var typeRegister = new Binding.TypeRegister(context);

            foreach (var kv in _modRegisters)
            {
                var pmr = kv.Value as ProxyModuleRegister;
                if (pmr != null)
                {
                    pmr.LoadTypes(typeRegister);
                }
            }

            typeRegister.Finish();
        }
Esempio n. 2
0
        /// <summary>
        /// 按照 TypeBindingInfo 的记录, 进行动态类型的成员绑定.
        /// </summary>
        public Binding.ClassDecl DoReflectBind(Binding.TypeRegister register)
        {
            var typeDB      = register.GetTypeDB();
            var dynamicType = typeDB.CreateFreeDynamicType(type);

            Binding.ClassDecl cls;

            if (transform.csConstructorOverride != null)
            {
                cls = register.CreateClass(type.Name, type, transform.csConstructorOverride);
            }
            else
            {
                var dynamicConstructor = default(Binding.IDynamicMethod);

                if (crossbind)
                {
                    dynamicConstructor = new Binding.DynamicCrossBindConstructor();
                }
                else
                {
                    if (constructors.count > 0)
                    {
                        var dynamicCtorGroup = new Binding.DynamicMethods(dynamicType, "constructor", 1);
                        foreach (var variant in constructors.variants)
                        {
                            foreach (var methodBind in variant.Value.plainMethods)
                            {
                                var dynamicCtor = new Binding.DynamicConstructor(dynamicType, methodBind.method, this.disposable);

                                dynamicCtorGroup.Add(dynamicCtor);
                            }
                        }
                        dynamicConstructor = dynamicCtorGroup;
                    }
                    else
                    {
                        // struct 默认无参构造
                        dynamicConstructor = new Binding.DynamicDefaultConstructor(dynamicType);
                    }
                }
                cls = register.CreateClass(type.Name, type, dynamicConstructor);
            }

            foreach (var pair in staticMethods)
            {
                var methodBindingInfo = pair.Value;
                var methodJSName      = methodBindingInfo.jsName;
                var jscOverride       = transform.GetCSMethodOverrideBinding(methodJSName);

                if (jscOverride != null)
                {
                    cls.AddMethod(true, methodJSName, jscOverride);
                }
                else
                {
                    var methodGroup = new Binding.DynamicMethods(dynamicType, methodJSName, 0);

                    foreach (var variantKV in methodBindingInfo.variants)
                    {
                        var expectedArgCount = variantKV.Key;
                        var variant          = variantKV.Value;

                        foreach (var mb in variant.plainMethods)
                        {
                            var dynamicMethod = new Binding.DynamicMethod(dynamicType, mb.method);

                            methodGroup.Add(dynamicMethod);
                        }

                        foreach (var mb in variant.varargMethods)
                        {
                            //TODO: [maybe] use a speficied dynamic method class for vararg method
                            var dynamicMethod = new Binding.DynamicMethod(dynamicType, mb.method);

                            methodGroup.Add(dynamicMethod);
                        }
                    }

                    cls.AddMethod(true, methodJSName, methodGroup);
                }
            }

            foreach (var pair in methods)
            {
                var methodBindingInfo = pair.Value;
                var methodJSName      = methodBindingInfo.jsName;
                var jscOverride       = transform.GetCSMethodOverrideBinding(methodJSName);

                if (jscOverride != null)
                {
                    cls.AddMethod(false, methodJSName, jscOverride);
                }
                else
                {
                    var methodGroup = new Binding.DynamicMethods(dynamicType, methodJSName, 0);

                    foreach (var variantKV in methodBindingInfo.variants)
                    {
                        var expectedArgCount = variantKV.Key;
                        var variant          = variantKV.Value;

                        foreach (var mb in variant.plainMethods)
                        {
                            var dynamicMethod = new Binding.DynamicMethod(dynamicType, mb.method);

                            methodGroup.Add(dynamicMethod);
                        }

                        foreach (var mb in variant.varargMethods)
                        {
                            //TODO: [maybe] use a speficied dynamic method class for vararg method
                            var dynamicMethod = new Binding.DynamicMethod(dynamicType, mb.method);

                            methodGroup.Add(dynamicMethod);
                        }
                    }

                    cls.AddMethod(false, methodJSName, methodGroup);
                }
            }

            foreach (var pair in properties)
            {
                var propertyBindingInfo = pair.Value;
                var isStatic            = propertyBindingInfo.isStatic;
                var tsPropertyVar       = this.bindingManager.GetTSVariable(propertyBindingInfo.regName);
                var dynamicProperty     = new Binding.DynamicProperty(dynamicType, propertyBindingInfo.propertyInfo);

                cls.AddField(isStatic, propertyBindingInfo.regName, dynamicProperty);
            }

            foreach (var pair in fields)
            {
                var fieldBindingInfo = pair.Value;
                var isStatic         = fieldBindingInfo.isStatic;
                var tsPropertyVar    = this.bindingManager.GetTSVariable(fieldBindingInfo.regName);
                var dynamicField     = new Binding.DynamicField(dynamicType, fieldBindingInfo.fieldInfo);

                cls.AddField(isStatic, fieldBindingInfo.regName, dynamicField);
            }

            foreach (var pair in events)
            {
                var eventBindingInfo = pair.Value;
                var tsDelegateVar    = this.bindingManager.GetTSVariable(eventBindingInfo.regName);
                var dynamicMethod    = new Binding.DynamicEventDelegateOp(dynamicType, eventBindingInfo.eventInfo, tsDelegateVar);

                cls.AddMethod(eventBindingInfo.isStatic, tsDelegateVar, dynamicMethod);
            }

            foreach (var pair in delegates)
            {
                var delegateBindingInfo = pair.Value;
                var tsDelegateVar       = this.bindingManager.GetTSVariable(delegateBindingInfo.regName);
                Binding.IDynamicMethod dynamicMethod = null;

                if (delegateBindingInfo.isField)
                {
                    dynamicMethod = new Binding.DynamicFieldDelegateOp(dynamicType, (FieldInfo)delegateBindingInfo.fieldOrPropertyInfo, tsDelegateVar);
                }
                else
                {
                    dynamicMethod = new Binding.DynamicPropertyDelegateOp(dynamicType, (PropertyInfo)delegateBindingInfo.fieldOrPropertyInfo, tsDelegateVar);
                }

                cls.AddMethod(delegateBindingInfo.isStatic, tsDelegateVar, dynamicMethod);
            }

            foreach (var operatorBindingInfo in operators)
            {
                var dynamicMethod = new Binding.DynamicMethod(dynamicType, operatorBindingInfo.methodInfo);
                var regName       = operatorBindingInfo.jsName;
                var parameters    = operatorBindingInfo.methodInfo.GetParameters();
                var declaringType = operatorBindingInfo.methodInfo.DeclaringType;

                do
                {
                    if (parameters.Length == 2)
                    {
                        if (parameters[0].ParameterType != declaringType)
                        {
                            var leftType = parameters[0].ParameterType;
                            cls.AddLeftOperator(regName, dynamicMethod, leftType);
                            break;
                        }
                        else if (parameters[1].ParameterType != declaringType)
                        {
                            var rightType = parameters[1].ParameterType;
                            cls.AddRightOperator(regName, dynamicMethod, rightType);
                            break;
                        }
                    }

                    cls.AddSelfOperator(regName, dynamicMethod);
                } while (false);
            }

            return(cls);
        }