クラスの一覧を取得する
すべてのクラス一覧を取得する
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)));
}