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

クラスの一覧を取得する

すべてのクラス一覧を取得する

IMetamodelsオブジェクトのAllClassesプロパティを用いることですべてのクラスを取得します。

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

// すべてのクラスを取得します
IClassCollection classes = metamodels.AllClasses;

foreach (var cls in classes)
{
if(cls.FullName.StartsWith("System."))
{
// システムで定義されたクラスを無視します
continue;
}

c.App.Output.WriteLine("sample", $"Class: {cls.Name}");
}
}
注意

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

  • パッケージ
    • 完全修飾名(IPackage.FullName)の接頭辞が「System.」
  • クラス
    • 完全修飾名(IClass.FullName)の接頭辞が「System.」
    • 名前(IClass.Name)の接頭辞が「___」
  • フィールド
    • 名前(IField.Name)の接頭辞が「$」
    • 名前(IField.Name)の接頭辞が「___」

パッケージ直下のクラス一覧を取得する

パッケージ名を指定して、そのパッケージ直下のクラス一覧を取得する例です。

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

// すべてのパッケージからパッケージを指定します
var packageName = "SomePackageName";
IPackageCollection packages = metamodels.AllPackages;
IPackage targetPackage = packages.FirstOrDefault(p => p.Name == packageName);
if(targetPackage == null)
{
c.App.Output.WriteLine("sample", $"指定されたパッケージは存在しません");
return;
}

// パッケージ直下のクラスの名前を出力します
IClassCollection classes = targetPackage.OwnedClasses;
foreach (var cls in classes)
{
if(cls.FullName.StartsWith("System."))
{
// システムで定義されたクラスを無視します
continue;
}

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

パッケージ配下のすべてのクラスを取得する

パッケージ名を指定して、そのパッケージ配下のすべてのクラスを取得する例です。

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

// すべてのパッケージからパッケージを指定します
var packageName = "SomePackageName";
IPackageCollection allPackages = metamodels.AllPackages;
IPackage targetPackage = allPackages.FirstOrDefault(p => p.Name == packageName);
if(targetPackage == null)
{
c.App.Output.WriteLine("sample", "指定されたパッケージは存在しません");
return;
}

// パッケージ直下のクラスの名前を出力します
// 配下のパッケージと自身を和集合とし、その直下のクラスの列挙を取得します
IEnumerable<IPackage> packages = GetAllSubPackages(targetPackage);
var classes = packages.SelectMany(p => p.OwnedClasses);
foreach (var cls in classes)
{
if(cls.FullName.StartsWith("System."))
{
// システムで定義されたクラスを無視します
continue;
}

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

private IEnumerable<IPackage> GetAllSubPackages(IPackage targetPackage)
{
if(!targetPackage.SubPackages.Any())
{
return new []{ targetPackage };
}
return new []{ targetPackage }.Union(targetPackage.SubPackages.SelectMany(p => GetAllSubPackages(p)));
}