public void BeginStaticModule(string moduleName) { _moduleReg = new Module.ProxyModuleRegister(_runtime); }
/// <summary> /// 按照 TypeBindingInfo 的记录, 进行动态类型的成员绑定. /// </summary> public Binding.ClassDecl DoReflectBind(Binding.TypeRegister register, Module.ProxyModuleRegister proxyModuleRegister) { 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); } // 注册运算符 if (operators.Count > 0) { //TODO: 目前运算符必须在同一个 TypeRegister 实例中注册 // proxyModuleRegister.MarkAsCritical(); } 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); }