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

クラスのフィールドを取得する

フィールド名を指定して取得する

フィールド名を指定してクラスからフィールドを取得するには、IClassオブジェクトのGetFieldメソッドを用います。

public void GetField(ICommandContext c, ICommandParams p)
{
// メタモデルを取得します
IMetamodels metamodels = c.App.Workspace.CurrentProject.Profile.Metamodels;

// "Actor"のクラスを取得します
IClass cls = metamodels.GetClass("Actor");

// "ユースケース"のフィールドを取得します
var field = cls.GetField("MainUseCases");

// フィールドの型名を出力します
c.App.Output.WriteLine("sample", $"Field: {field.Type}");
}

フィールドの一覧を取得する

クラスからフィールドの一覧を取得するには、IClassオブジェクトのGetFieldsメソッドを用います。

public void GetFields(ICommandContext c, ICommandParams p)
{
// メタモデルを取得します
IMetamodels metamodels = c.App.Workspace.CurrentProject.Profile.Metamodels;

// "Actor"のクラスを取得します
IClass cls = metamodels.GetClass("Actor");

// "Actor"のクラスのフィールドを取得します
IFieldCollection fields = cls.GetFields();

foreach (var field in fields)
{
// システムフィールドは除外します
if (field.Name.StartsWith("___") || field.Name.StartsWith("$") || field.HasTags("System,System.Core")) continue;

c.App.Output.WriteLine("sample", $"Field: {field.DisplayName}");
}
}

システム定義のフィールドかどうかを判断する

APIを利用してフィールドを取得した場合、システムで定義されたフィールドも同時に取得できます。 システムで定義されたフィールドは次のルールに従うため、不要ならば除外してください。

  • 名前(IField.Name)の接頭辞が「$」
  • 名前(IField.Name)の接頭辞が「___」
  • フィールドのタグにSystemSystem.Coreが設定されている

下記のようなメソッドを用意すると便利です。

private bool IsSystemField(IField field)
{
// システムフィールドは除外します
return field.Name.StartsWith("___") || field.Name.StartsWith("$") || field.HasTags("System,System.Core");
}

次のように利用できます。

IClass myClass = ...

// システムフィールド以外を取得します
var fields = myClass.GetFields().Where( f=> !IsSystemField(f) );

自身のフィールドを取得する

自身のクラスで定義したフィールドのみ取得したい場合、IClassオブジェクトのDeclaredFieldsプロパティを用います。

public void GetDeclaredFields(ICommandContext c, ICommandParams p)
{
// メタモデルを取得します
IMetamodels metamodels = c.App.Workspace.CurrentProject.Profile.Metamodels;

// "Actor"のクラスを取得します
IClass cls = metamodels.GetClass("Actor");

// "Actor"のクラスで定義したフィールドを取得します
IFieldCollection declaredFields = cls.DeclaredFields;

// "Actor"のクラスのすべてのフィールドから自身のクラスで定義したフィールドを除いたフィールドを取得します
IEnumerable<IField> fields = cls.GetFields().Except(declaredFields);

// "Actor"のクラスで定義したフィールドをシステムフィールドを除いて出力します
foreach (var field in declaredFields)
{
// システムフィールドは除外します
if (field.Name.StartsWith("___") || field.Name.StartsWith("$") || field.HasTags("System,System.Core")) continue;

c.App.Output.WriteLine("sample", $"DeclaredFields: {field.DisplayName}");
}

// "Actor"のクラスのすべてのフィールドから自身のクラスで定義したフィールドとシステムフィールドを除いて出力します
foreach (var field in fields)
{
// システムフィールドは除外します
if (field.Name.StartsWith("___") || field.Name.StartsWith("$") || field.HasTags("System,System.Core")) continue;

c.App.Output.WriteLine("sample", $"Field: {field.DisplayName}");
}
}

継承元を含めたすべてのフィールドを取得する

継承元を含めたすべてのフィールドを表示する場合、IClassオブジェクトのGetFieldsメソッドの他にFieldsプロパティを用いることができます。IClass.Fieldsプロパティでは、IDictionary<string, IField>の辞書を取得できます。 辞書のKey にフィールド名、Value にフィールドオブジェクトが設定されており、すべてのフィールド取得後にフィールド名を指定して取得することができます。

public void GetFieldsDictionary(ICommandContext c, ICommandParams p)
{
// メタモデルを取得します
IMetamodels metamodels = c.App.Workspace.CurrentProject.Profile.Metamodels;

// "Actor"のクラスを取得します
IClass cls = metamodels.GetClass("Actor");

// "Actor"のクラスのフィールドを取得します
IDictionary<string, IField> fields = cls.Fields;

foreach (var field in fields)
{
// システムフィールドは除外します
if (field.Name.StartsWith("___") || field.Name.StartsWith("$") || field.HasTags("System,System.Core")) continue;

c.App.Output.WriteLine("sample", $"Field: {field.Key}");
c.App.Output.WriteLine("sample", $"Field: {field.Value.DisplayName}");
}
}