クラスのフィールドを取得する
フィールド名を指定して取得する
フィールド名を指定してクラスからフィールドを取得するには、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
)の接頭辞が「___」 - フィールドのタグに
System
やSystem.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}");
}
}