Skip to content

サーバースクリプトのメソッドを拡張する ​

第3版作成 最終更新 (日本時間)
確認バージョン1.5.8.1

サーバースクリプトのメソッドは本体コードを改修すれば拡張できます。このページでは例として、選択肢を制御する columns.AddChoiceHash(キーと値の 2 引数)を、値だけで呼べるようにします。結論としては、キーと値に同じ値を渡すオーバーロード(またはデフォルト引数)を追加するだけで実現できます。

1.5.8.1 では標準で使える

1.5.8.1 のソースには、この記事のオーバーロードと同じ AddChoiceHash(object key) => AddChoiceHash(key, key) が含まれています(ServerScriptModel.cs)。1.5.8.1 以降では、本体を改修しなくても columns.ClassA.AddChoiceHash('値') のように値だけで呼べます。以下は、メソッドを拡張する手順の例として読んでください。

本体改変について

本体コードの改変が必要です。試すには、Visual Studio や Visual Studio Code など、ビルドして実行する環境が必要です。ビルド環境は 公式リポジトリの CONTRIBUTING.md を参照してください。

サーバースクリプトのメソッドの在りか ​

  • サーバースクリプトは Implem.Pleasanter/Libraries/ServerScripts 配下のファイル群で定義されています。
  • $ps. で始まるメソッドは ClearScript(JavaScript)で、それ以外は C# で実装されています。
  • columns 配下のメソッドは ServerScriptModel.cs にあります。AddChoiceHash は ServerScriptModel.cs#L272-L280 です。

下調べ:ChoiceHash がどう使われるか ​

columns にセットされた値は _BaseModel.cs で処理され、クライアントに渡すために Choice モデルへ詰め替えられます。

Choice モデルは、項目ごとの選択肢一覧や Wiki の選択肢化でも使われるモデルです。やりたいことは「選択肢一覧で値だけを設定する」のと同じなので、選択肢一覧を Choice に詰め替える処理(Choice.cs#L45-L59)を見ます。

選択肢の文字列はセパレータで分割されて配列になり、_序数 で始まる拡張メソッド(N 番目の値があれば返し、なければ null)と Strings.CoalesceEmpty(第 1 引数が null / 空でなければそれを、そうでなければ第 2 引数を返す)で各プロパティに割り当てられます。結果は次のとおりです。

選択肢設定ValueTextTextMiniCssClassStyle
完了完了完了完了
900,完了900完了完了
900,完了,完900完了完
900,完了,完,status-closed900完了完status-closed
900,完了,完,status-closed,color:red;900完了完status-closedcolor:red;

値だけを与えるときは、Value、Text、TextMini に同じ値が入ればよいことが分かります。

一方、サーバースクリプトの ChoiceHash からの詰め替えは Choice のコンストラクタ(Choice.cs#L15-L29)で、第 3 引数以降は省略されています。

サーバースクリプト側選択肢の実体
o.Key.ToString()Value
o.Value?.ToString()Text
o.Value?.ToString()TextMini

2 つの表を突き合わせると、サーバースクリプト側では Key と Value に同じ値をセットすればよい ことが分かります。

実装 ​

オーバーロードを使う方法と、デフォルト引数を使う方法の 2 通りがあります。

オーバーロード ​

csharp
//オーバーロードを追加する
public void AddChoiceHash(object key) => AddChoiceHash(key, key);

//下記は既存コード
public void AddChoiceHash(object key, object value)
{
    if (ChoiceHash == null)
    {
        ChoiceHash = new Dictionary<object, object>();
    }
    ChoiceHash.Add(key, value);
    _choiceHashChanged = true;
}

デフォルト引数 ​

csharp
public void AddChoiceHash(object key, object value = null)
{
    value ??= key; //ここを追加
    if (ChoiceHash == null)
    {
        ChoiceHash = new Dictionary<object, object>();
    }
    ChoiceHash.Add(key, value);
    _choiceHashChanged = true;
}

どちらを選ぶかは好みですが、本体へコントリビュートする場合はデフォルト引数のほうが優勢と考えられます。

TIP

本体コードの改修は、サーバースクリプト周りから手をつけると分かりやすくおすすめです。

関連ページ ​

変更履歴

第3版「サーバースクリプト」を 1.5.8.1 のソースで検証して修正
第2版記事のファイル名に並び順の番号を付け、元記事リンクを frontmatter の sources に移行
第1版「サーバースクリプト」セクションの記事を追加