フィールド値を取得する
ここではモデルに対するフィールド値の取得の基礎について説明します。
メタモデル定義とフィールド値の型
Next Designでは、モデルをフィールド値をメタモデルで定義するフィールド型に対応するC#言語のデータ型で保持します。フィールド型とAPIで公開するC#言語のデータ型との関係は次の通りです。
フィールドの型 | C#言語のデータ型 |
---|---|
文字列型 | string |
整数型 | int |
実数型 | double |
真偽値 | bool |
列挙型 | IEnumLiteral |
リッチテキスト型 | ※1 |
クラス型(単数) | IModel |
クラス型(複数) | IModelCollection |
リッチテキスト型は、書式フォーマット(text|html|xaml)ごとに複数のテキストを保持する特別なデータ形式で保持します。このデータ形式はAPIでは公開されていません。ほとんどのフィールド値取得のAPIでは、書式のないプレーンテキストを string 型で 扱います。リッチテキスト型のフィールド値を書式付きで扱う場合は、リッチテキストフィールドを操作するを参照してください。
APIでは、モデルのフィールド値を取得するためにIModel
インタフェースでいくつかのメソッドを公開しています。
メソッド | 説明 |
---|---|
GetField, GetFieldAt | APIで公開するC#言語のデータ型で取得したい場合に利用できます。詳しくはこちらを参照してください。 |
GetFieldString, GetFieldStringAt | フィールド型に関係なく、常に文字列として取得したい場合に利用できます。詳しくはこちらを参照してください。 |
GetFieldValues | クラス型(複数)のフィールド型のモデルコレクションを取得したい場合に利用できます。詳しくはこちらを参照してください。 |
GetRichTextField | フォーマットを指定してリッチテキスト型のフィールド値を取得したい場合に利用できます。詳しくはこちらを参照してください。 |
object型で取得する
object型でフィールド値を取得する場合は、IModel
オブジェクトのGetField
メソッドを用います。取得した object 型の実体はメタモデルのフィールドの型によって変わるのでキャストして使うことになります。フィールドの型とC#上の型との関係は次の通りです。
フィールドの型 | objectをキャストできるC#上の型 |
---|---|
文字列型 | string |
整数型 | int |
実数型 | double |
真偽値 | bool |
列挙型 | IEnumLiteral |
リッチテキスト型 | string ※2 |
クラス型(単数) | IModel |
クラス型(複数) | IModel ※3 |
リッチテキスト型のフィールドに対してGetField
メソッドを呼び出した場合は、書式のないプレーンテキストを string 型で取得します。
多重度が2以上のクラス型のフィールドに対してGetField
メソッドを呼び出した場合は、該当フィールドの先頭のモデルを取得します。先頭以外のモデルを取得したい場合は、GetFieldAt
メソッドで 0 を基点とするインデックスを指定するか、GetFieldValues
メソッドを用いてモデルのコレクションを取得してください。
public void GetField(ICommandContext c, ICommandParams p)
{
IModel model = c.App.Workspace.CurrentModel;
// "SomeField"というフィールド名の場合
object someFieldValue = model.GetField("SomeField");
//...
}
文字列型で取得する
フィールド値は、フィールドの型に関係なく文字列として取得することができます。文字列型で取得する場合は IModel
オブジェクトのGetFieldString
メソッドを用います。フィールドの型と取得できる文字列の関係は次の通りです。
フィールドの型 | 取得できる文字列 |
---|---|
文字列型 | フィールド値の文字列 |
整数型 | フィールド値(整数)の文字列表現 |
実数型 | フィールド値(実数)の文字列表現。実数の値によっては指数表記となる場合があります。 |
真偽値 | "True" または "False" |
列挙型 | 列挙リテラルの名前 |
リッチテキスト型 | 書式のないプレーンテキスト |
クラス型(単数) | モデルの名前 |
クラス型(複数) | モデルの名前 ※4 |
多重度が2以上のクラス型のフィールドに対してGetField
メソッドを呼び出した場合は、該当フィールドの先頭のモデル名を取得します。先頭以外のモデルを取得したい場合は、GetFieldStringAt
メソッドで 0 を基点とするインデックスを指定してください。
public void GetFieldString(ICommandContext c, ICommandParams p)
{
IModel model = c.App.Workspace.CurrentModel;
string someFieldValue = model.GetFieldString("SomeField");
//...
}
列挙型のリテラル値を取得する
NextDesignでは、列挙型のフィールド値は、列挙リテラル型(IEnumLiteral
)で保持します。
列挙型のリテラル値は IModel
オブジェクトのGetField
メソッドを用いてobject
型で取得した後、列挙リテラル型(IEnumLiteral
)にキャストして、IEnumLiteral
オブジェクトのName
プロパティで取得することができます。
public void GetField(ICommandContext c, ICommandParams p)
{
IModel model = c.App.Workspace.CurrentModel;
IEnumLiteral someFieldValue = model.GetField("SomeField") as IEnumLiteral;
if (someFieldValue == null)
{
c.App.Window.UI.ShowMessageBox("列挙型のフィールド値ではありません。");
return;
}
c.App.Window.UI.ShowMessageBox($"SomeFieldのリテラル:{someFieldValue.Name}");
//...
}