如何在没有对象实例的情况下获得Ecore功能的显式名称?

时间:2016-10-18 12:50:05

标签: eclipse-emf emf eclipse-emf-ecore

我想创建一个GUI表来显示EObject子类的给定功能列表。为此,我必须获取列标题的功能的显示名称。

如何以最佳方式获取功能显示名称?

一个看起来有点像黑客的解决方案:

如果我有一个类的实例,那么我可以使用适配器工厂来获得可以执行此操作的IItemPropertySource

SomeEntity e = ...
String displayName = adaptorFactory.adapt(e, IItemPropertySource.class)
    .getPropertyDescriptor(null, feature).getDisplayName(null));

但是当表格为空时,没有SomeEntity对象可用于获取IItemPropertySource

我可以用这种方式使用EFactory创建一个虚拟对象:

EClass containingClass = feature.getEContainingClass();
SomeEntity dummy = containingClass.getEPackage().getEFactoryInstance()
    .create(containingClass));

...然后使用该对象获取IItemPropertySource。但这看起来有点像黑客。没有更好的解决方案吗?

1 个答案:

答案 0 :(得分:2)

如果您在编译时知道该类,则可以自己创建ItemProviderAdapter

MyClassItemProvider provider = new MyClassItemProvider(adaptorFactory);
String name = provider.getPropertyDescriptor(null, property).getDisplayName(null);

如果您在编译时不知道该类,但在运行时只有EClass实例,则事情会更复杂,因为必要的方法受到保护。你必须" make"他们先公开。

我会将相应的方法添加到生成的MyPackageSwitchMyPackageAdapterFactory类(在myPackage.util中)。

MyPackageAdapterFactory

/**
 * @generated NOT
 */
public MyPackageSwitch<Adapter> getModelSwitch() {
    return modelSwitch;
}

MyPackageSwitch

/**
 * generated NOT
 */
public T doPublicSwitch(EClass theEClass, EObject theEObject) {
    return doSwitch(theEClass, theEObject);
}

现在,您可以为ItemProviderAdapter EClass创建theEClass,如下所示:

provider = (ItemProviderAdapter) adapterFactory.getModelSwitch()
        .doPublicSwitch(theEClass, null);
EMF显然不是为此而做的。请记住,只有在您没有使用EObject值的任何自定义提供程序实现时,这一切才有效。