예제 #1
0
        public void PullValue(NodeDispatcher dispatcher)
        {
            if (dispatcher == Source.Dispatcher)
            {
                object value;
                if (!_values.TryTake(out value))
                {
                    value = SourcePin.GetValue();
                }

                TargetPin.SetValue(value);
            }
            else
            {
                TargetPin.SetValue(_values.Take());
            }
        }
예제 #2
0
        public override async System.Threading.Tasks.Task GCode_CodeDom_GenerateCode(CodeTypeDeclaration codeClass, CodeStatementCollection codeStatementCollection, CodeGenerateSystem.Base.LinkPinControl element, CodeGenerateSystem.Base.GenerateCodeContext_Method context)
        {
            if (element == null || element == mCtrlMethodIn)
            {
                var param     = CSParam as ClassCastControlConstructParam;
                var paramName = GCode_GetValueName(mCastResultPin, context);

                if (!mTargetPin.GetLinkedObject(0).IsOnlyReturnValue)
                {
                    await mTargetPin.GetLinkedObject(0).GCode_CodeDom_GenerateCode(codeClass, codeStatementCollection, mTargetPin.GetLinkedPinControl(0), context);
                }

                if (!context.Method.Statements.Contains(mVariableDeclaration))
                {
                    mVariableDeclaration = new CodeVariableDeclarationStatement(param.ResultType, paramName, new CodePrimitiveExpression(null));
                    context.Method.Statements.Insert(0, mVariableDeclaration);
                }

                #region Debug
                // 收集用于调试的数据的代码
                var debugCodes = CodeDomNode.BreakPoint.BeginMacrossDebugCodeStatments(codeStatementCollection);
                CodeDomNode.BreakPoint.GetGatherDataValueCodeStatement(debugCodes, TargetPin.GetLinkPinKeyName(), GCode_CodeDom_GetValue(mTargetPin, context), GCode_GetTypeString(mTargetPin, context), context);
                var breakCondStatement = CodeDomNode.BreakPoint.BreakCodeStatement(codeClass, debugCodes, HostNodesContainer.GUID, Id);
                CodeDomNode.BreakPoint.EndMacrossDebugCodeStatements(codeStatementCollection, debugCodes);
                #endregion

                var tryCatchStatement = new CodeTryCatchFinallyStatement();
                codeStatementCollection.Add(tryCatchStatement);
                tryCatchStatement.TryStatements.Add(new CodeAssignStatement(
                                                        new CodeVariableReferenceExpression(paramName),
                                                        new CodeGenerateSystem.CodeDom.CodeCastExpression(
                                                            param.ResultType,
                                                            mTargetPin.GetLinkedObject(0).GCode_CodeDom_GetValue(mTargetPin.GetLinkedPinControl(0), context))));

                var catchClause = new CodeCatchClause("catchException", new CodeTypeReference(typeof(System.Exception)),
                                                      new CodeAssignStatement(
                                                          new CodeVariableReferenceExpression(paramName),
                                                          new CodePrimitiveExpression(null)));
                tryCatchStatement.CatchClauses.Add(catchClause);

                #region Debug
                // 转换之后收集一次数据
                var debugCodesAfter = CodeDomNode.BreakPoint.BeginMacrossDebugCodeStatments(codeStatementCollection);
                CodeDomNode.BreakPoint.GetGatherDataValueCodeStatement(debugCodesAfter, CastResultPin.GetLinkPinKeyName(), GCode_CodeDom_GetValue(CastResultPin, context), GCode_GetTypeString(CastResultPin, context), context);
                CodeDomNode.BreakPoint.EndMacrossDebugCodeStatements(codeStatementCollection, debugCodesAfter);
                #endregion

                var condStatement = new CodeConditionStatement();
                codeStatementCollection.Add(condStatement);
                condStatement.Condition = new CodeBinaryOperatorExpression(
                    new CodeVariableReferenceExpression(paramName),
                    CodeBinaryOperatorType.IdentityInequality,
                    new CodePrimitiveExpression(null));

                if (mCtrlMethodOut.HasLink)
                {
                    await mCtrlMethodOut.GetLinkedObject(0).GCode_CodeDom_GenerateCode(codeClass, condStatement.TrueStatements, mCtrlMethodOut.GetLinkedPinControl(0), context);
                }
                if (mCastFailedPin.HasLink)
                {
                    await mCastFailedPin.GetLinkedObject(0).GCode_CodeDom_GenerateCode(codeClass, condStatement.FalseStatements, mCastFailedPin.GetLinkedPinControl(0), context);
                }
            }
            else
            {
                throw new InvalidOperationException();
            }
        }