Get a class's fields
Get by specifying the field name
To get a field from a class by specifying the field name, use the GetField method of the IClass object.
public void GetField(ICommandContext c, ICommandParams p)
{
    //Get the metamodels
    IMetamodels metamodels = c.App.Workspace.CurrentProject.Profile.Metamodels;
    //Get the class of "Actor"
    IClass cls = metamodels.GetClass("Actor");
    //Get the field of "Use case"
    var field = cls.GetField("MainUseCases");
    //Output the type name of the field
    c.App.Output.WriteLine("sample", $"Field: {field.Type}");
}
Get a list of fields
To get a list of fields from a class, use the GetFields method of the IClass object.
public void GetFields(ICommandContext c, ICommandParams p)
{
    //Get the metamodels
    IMetamodels metamodels = c.App.Workspace.CurrentProject.Profile.Metamodels;
    //Get the class of "Actor"
    IClass cls = metamodels.GetClass("Actor");
    //Get the fields of the class of "Actor"
    IFieldCollection fields = cls.GetFields();
    foreach (var field in fields)
    {
        //Exclude system fields
        if (field.Name.StartsWith("___") || field.Name.StartsWith("$") || field.HasTags("System,System.Core")) continue;
        c.App.Output.WriteLine("sample", $"Field: {field.DisplayName}");
    }
}
Determine if a field is system-defined
When you retrieve a field using the API, you can also retrieve system-defined fields at the same time. System-defined fields follow the following rules, so exclude them if you do not need them.
- The name (IField.Name) is prefixed with "$"
- The name (IField.Name) is prefixed with "___"
- The field tag is set to SystemorSystem.Core
It is useful to prepare a method like the one below.
private bool IsSystemField(IField field)
{
    //Exclude system fields
    return field.Name.StartsWith("___") || field.Name.StartsWith("$") || field.HasTags("System,System.Core");
}
You can use them as follows.
IClass myClass = ...
//Get non-system fields
var fields = myClass.GetFields().Where(f => !IsSystemField(f));
Get your own fields
If you want to get only the fields defined in your own class, use the DeclaredFields property of the IClass object.
public void GetDeclaredFields(ICommandContext c, ICommandParams p)
{
    //Get the metamodels
    IMetamodels metamodels = c.App.Workspace.CurrentProject.Profile.Metamodels;
    //Get the "Actor" class
    IClass cls = metamodels.GetClass("Actor");
    //Get the fields defined in the "Actor" class
    IFieldCollection declaredFields = cls.DeclaredFields;
    //Get all fields in the "Actor" class excluding fields defined in the class itself
    IEnumerable<IField> fields = cls.GetFields().Except(declaredFields);
    //Output the fields defined in the "Actor" class excluding system fields
    foreach (var field in declaredFields)
    {
        //Exclude system fields
        if (field.Name.StartsWith("___") || field.Name.StartsWith("$") || field.HasTags("System,System.Core")) continue;
        c.App.Output.WriteLine("sample", $"DeclaredFields: {field.DisplayName}");
    }
    //Output all fields of the "Actor" class, excluding fields defined in the class itself and system fields.
    foreach (var field in fields)
    {
        //Exclude system fields.
        if (field.Name.StartsWith("___") || field.Name.StartsWith("$") || field.HasTags("System,System.Core")) continue;
        c.App.Output.WriteLine("sample", $"Field: {field.DisplayName}");
    }
}
Get all fields including those inherited
To display all fields including those inherited, you can use the Fields property in addition to the GetFields method of the IClass object. The IClass.Fields property allows you to get a dictionary of IDictionary<string, IField>. The field name is set as the Key of the dictionary, and the field object is set as the Value, so you can specify the field name to get it after getting all the fields.
public void GetFieldsDictionary(ICommandContext c, ICommandParams p)
{
    //Get the metamodels
    IMetamodels metamodels = c.App.Workspace.CurrentProject.Profile.Metamodels;
    //Get the class of "Actor"
    IClass cls = metamodels.GetClass("Actor");
    //Get the fields of the class of "Actor"
    IDictionary<string, IField> fields = cls.Fields;
    foreach (var field in fields)
    {
        //Exclude system 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}");
    }
}