OutSystemsのExtensionでRange Action作ってみた


きっかけ

Outsystemsで、いろいろなループの処理時間を計測してみたでRange ActionをExtensionで作っているのを見て、もう少し改良できそうと思ったので取り組んでみました。

コード

using System;
using System.Collections;
using System.Data;
using OutSystems.HubEdition.RuntimePlatform;
using OutSystems.RuntimePublic.Db;
using OutSystems.HubEdition.RuntimePlatform.Db;

namespace OutSystems.NssRangeExtension {

    public class CssRangeExtension: IssRangeExtension {

        /// <summary>
        /// 
        /// </summary>
        /// <param name="ssDestinationList"></param>
        /// <param name="ssFrom"></param>
        /// <param name="ssTo"></param>
        public void MssRange(object ssDestinationList, int ssFrom, int ssTo) {
            IOSList list = (IOSList)ssDestinationList;

            for(int i = 0, j = ssFrom; j < ssTo; i++, j++)
            {
                list.Insert(i, j);                
            }                        
        } // MssRange

    } // CssRangeExtension

} // OutSystems.NssRangeExtension

使い方

このListの型はInteger Listです(既に別のRange Actionを作ってしまっていたのでAction名がRange2になってしまっています)。

コード説明

なぜかExtensionのInput/Output ParameterにはRecord Listは設定できるのですが、プリミティブ型のListが設定できません(Integer Listなど)。そのためObject型を使うことにしました。Output ParameterにObject型を設定しても、その後それをOutSystemsの中でList型に変換することはできません。そのため、Input Parameterとして受け取ったObject型の変数(元はInteger List型)をExtensionの中で加工することにしました。Objectは参照渡しのため、この方法でも元のInteger List型の変数の値を変更できます。その他にもBinary Data型、List型が参照渡しのようです。これは忘れがちなので要注意ですね!古いですがリンクを載せておきます。

おまけ

当初、Range Actionの実装をするときに、IEnumerableを返せばForEachのRecord Listの中にFunctionとして書けるのでは?と思ったのですが、残念ながらOutSystemsはIEnumerableには対応していませんでした。ということで今回の実装になりました。よりよい実装があれば是非教えて欲しいです。
https://www.outsystems.com/forums/discussion/33259/using-httprequestmessage-and-ienumerable/