/// <summary> /// 返り値を処理します。 /// </summary> /// <param name="col">スクリプトのルートノード</param> /// <param name="returnValue">返り値を格納する変数</param> /// <param name="result">メソッド呼び出しの返り値</param> private static void ProcReturnValue(MultiRootConnector col, ICbValue returnValue, object result) { if (returnValue.IsList) { ICbList retCbList = returnValue.GetListValue; retCbList.CopyFrom(result); col.LinkConnectorControl.UpdateValueData(); } else if (result != null && returnValue is ICbEvent cbEvent) { // デリゲート型の返し値 Type resultType = CbSTUtils.GetDelegateReturnType(result.GetType()); if (!CbSTUtils.IsVoid(resultType)) { // 返し値のあるデリゲート型 cbEvent.Callback = (cagt) => { ICbValue retTypeValue = null; try { // イベントからの返り値を取得 object tempReturnValue = ((dynamic)result).Invoke(cagt.GetValue().Data); // 直接メソッドを呼ぶため帰ってくるのは通常の値なので Cb タイプに変換する retTypeValue = CbST.CbCreate(tempReturnValue.GetType()); retTypeValue.Data = tempReturnValue; } catch (Exception ex) { col.ExceptionFunc(null, ex); } return(retTypeValue); }; } else { // 返し値の無いデリゲート型 cbEvent.Callback = (cagt) => { try { var argType = cagt.GetValue(); if (argType is null) { ((dynamic)result).Invoke(null); } else { ((dynamic)result).Invoke(argType.Data); } } catch (Exception ex) { col.ExceptionFunc(null, ex); } return(new CbVoid()); }; } } else { returnValue.Data = result; } }
/// <summary> /// メソッド呼び出し処理を実装する /// </summary> /// <param name="col">スクリプトのルートノード</param> /// <param name="dummyArgumentsControl">仮引数管理</param> protected bool ImplAsset( MultiRootConnector col, DummyArgumentsControl dummyArgumentsControl, string exTitle) { Type classType = ClassType; string funcTitle = FuncTitle; Func <ICbValue> returnType = ReturnType; if (classType.IsGenericType) { // ジェネリッククラスの型を確定する var data = ReturnType().Data; if (data is CbGeneMethArg gmaType) { List <Type> argTypes = new List <Type>(); for (int i = 0; i < typeRequests.Count; ++i) { argTypes.Add(col.SelectedVariableType[i]); } //クラスの型を確定した型で差し替える classType = classType.MakeGenericType(argTypes.ToArray()); if (IsConstructor) { returnType = CbST.CbCreateTF(classType); if (funcTitle.Contains("<")) { // 確定した型情報に差し替える funcTitle = funcTitle.Substring(0, funcTitle.IndexOf("<")); } } } else if (CbSTUtils.HaveGenericParamater(classType)) { // ユーザー選択ではなく直接 self からコピーされた型の場合は、そのまま内容を登録する List <Type> argTypes = new List <Type>(); for (int i = 0; i < typeRequests.Count; ++i) { argTypes.Add(col.SelectedVariableType[i]); } //クラスの型を確定した型で差し替える classType = CbST.GetTypeEx(classType.FullName).MakeGenericType(argTypes.ToArray()); } } {// 返し値の型を差し替える var methodReturnType = returnType(); if (methodReturnType.MyType == typeof(CbClass <CbGeneMethArg>)) { // 未確定なジェネリック型を確定した型で差し替える // 引数の型を差し替える Type repType = GetConfirmedType(col, (CbGeneMethArg)methodReturnType.Data); returnType = CbST.CbCreateTF(repType); } } List <ICbValue> argumentTypeList = new List <ICbValue>(); if (ArgumentTypeList != null) { // 引数用の変数を用意する foreach (var node in ArgumentTypeList) { var argumentType = node.CreateArgument(); if (argumentType.MyType == typeof(CbClass <CbGeneMethArg>)) { // 未確定なジェネリック型を確定した型で差し替える // 引数の型を差し替える Type replaceArgumentType = GetConfirmedType(col, (CbGeneMethArg)argumentType.Data); argumentType = CbST.CbCreate(replaceArgumentType, argumentType.Name); } argumentTypeList.Add(argumentType); } } col.OldSpecification = oldSpecification; col.MakeFunction( funcTitle + exTitle, NodeHelpText, returnType, argumentTypeList, new Func <List <ICbValue>, DummyArgumentsStack, ICbValue>( (arguments, cagt) => { var ret = returnType(); if (dummyArgumentsControl != null && dummyArgumentsControl.IsInvalid(cagt)) { return(ret); // 実行環境が有効でない } ImplCallMethod(col, classType, dummyArgumentsControl, arguments, cagt, ret); return(ret); } ) ); argumentTypeList.Clear(); return(true); }