フィールド値を取得する
ここではモデルに対するフィールド値の取得の基礎について説明します。
メタモデル定義とフィールド値の型
Next Designでは、モデルをフィールド値をメタモデルで定義するフィールド型に対応するC#言語のデータ型で保持します。フィールド型とAPIで公開するC#言語のデータ型との関係は次の通りです。
フィールドの型 | C#言語のデータ型 |
---|---|
文字列型 | string |
整数型 | int |
実数型 | double |
真偽値 | bool |
列挙型 | IEnumLiteral |
リッチテキスト型 | ※1 |
クラス型(単数) | IModel |
クラス型(複数) | IModelCollection |
※1
リッチテキスト型は、書式フォーマット(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 |
※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");
//...
}
}