メインコンテンツまでスキップ

フィールド値を取得する

ここではモデルに対するフィールド値の取得の基礎について説明します。

メタモデル定義とフィールド値の型

Next Designでは、モデルをフィールド値をメタモデルで定義するフィールド型に対応するC#言語のデータ型で保持します。フィールド型とAPIで公開するC#言語のデータ型との関係は次の通りです。

フィールドの型C#言語のデータ型
文字列型string
整数型int
実数型double
真偽値bool
列挙型IEnumLiteral
リッチテキスト型※1
クラス型(単数)IModel
クラス型(複数)IModelCollection
※1

リッチテキスト型は、書式フォーマット(text|html|xaml)ごとに複数のテキストを保持する特別なデータ形式で保持します。このデータ形式はAPIでは公開されていません。ほとんどのフィールド値取得のAPIでは、書式のないプレーンテキストを string 型で扱います。リッチテキスト型のフィールド値を書式付きで扱う場合は、リッチテキストフィールドを操作するを参照してください。

APIでは、モデルのフィールド値を取得するためにIModelインタフェースでいくつかのメソッドを公開しています。

メソッド説明
GetField, GetFieldAtAPIで公開するC#言語のデータ型で取得したい場合に利用できます。詳しくはこちらを参照してください。
GetFieldString, GetFieldStringAtフィールド型に関係なく、常に文字列として取得したい場合に利用できます。詳しくはこちらを参照してください。
GetFieldValuesクラス型(複数)のフィールド型のモデルコレクションを取得したい場合に利用できます。詳しくはこちらを参照してください。
GetRichTextFieldフォーマットを指定してリッチテキスト型のフィールド値を取得したい場合に利用できます。詳しくはこちらを参照してください。

object型で取得する

object型でフィールド値を取得する場合は、IModelオブジェクトのGetFieldメソッドを用います。取得した object 型の実体はメタモデルのフィールドの型によって変わるのでキャストして使うことになります。フィールドの型とC#上の型との関係は次の通りです。

フィールドの型objectをキャストできるC#上の型
文字列型string
整数型int
実数型double
真偽値bool
列挙型IEnumLiteral
リッチテキスト型string ※2
クラス型(単数)IModel
クラス型(複数)IModel ※3
※2

リッチテキスト型のフィールドに対してGetFieldメソッドを呼び出した場合は、書式のないプレーンテキストを string 型で取得します。

※3

多重度が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
※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}");

//...
}
note

IModelオブジェクトのGetFieldStringメソッドを用いれば、直接リテラル値を取得することもできます。

真偽値を取得する

真偽値を取得する場合は IModelオブジェクトのGetFieldメソッドを用いてobject型で取得した後、真偽値型にキャストします。

public void GetField(ICommandContext c, ICommandParams p)
{
IModel model = c.App.Workspace.CurrentModel;
bool? someFieldValue = model.GetField("SomeField") as bool?;

if (!someFieldValue.HasValue)
{
c.App.Window.UI.ShowMessageBox("真偽値型のフィールド値ではありません。");
}

//...
}

モデルを取得する

フィールドの型が単一のクラス型の場合は、IModelオブジェクトのGetFieldメソッドを用いてobject型で取得した後、IModel型にキャストします。

public void GetField(ICommandContext c, ICommandParams p)
{
IModel model = c.App.Workspace.CurrentModel;

// "Actor"というフィールド名の場合
IModel actor = model.GetField("Actor") as IModel;

if (actor == null)
{
c.App.Window.UI.ShowMessageBox("クラス型のフィールド値ではありません。");
}

//...
}

フィールドの型が複数のクラス型(多重度の上限が1でない)の場合は、IModelオブジェクトのGetFieldAtメソッドで 0 を基点とするインデックスを指定することで、任意の位置のモデルを取得できます。GetFieldAtメソッドはobject型で値を返すため、IModel型にキャストします。なお、フィールド値の個数は、IModelオブジェクトのCountメソッドで調べることができます。

public void GetFieldAt(ICommandContext c, ICommandParams p)
{
IModel model = c.App.Workspace.CurrentModel;

// "Usecases"というフィールド名の場合
var count = model.Count("Usecases");
if (count > 0)
{
// フィールドの末尾のモデルを取得します
// インデックスは 0 基点となります
var index = count - 1;
IModel usecase = model.GetFieldAt("Usecases", index) as IModel;
}
}

モデルのコレクションを取得する

フィールドの型が複数のクラス型(多重度の上限が1でない)の場合は、IModelオブジェクトのGetFieldValuesメソッドを用いることで、モデルのコレクションを取得できます。

public void GetField(ICommandContext c, ICommandParams p)
{
IModel model = c.App.Workspace.CurrentModel;

// "SubComponents"というフィールドがモデルのコレクションの場合
IModelCollection subComponents = model.GetFieldValues("SubComponents") ;

// subComponentはIModel型になります
foreach (var subComponent in subComponents)
{
var someFieldValue = subComponent.GetFieldString("SomeField");
//...
}
}