【问题标题】:How to get an Ecore feature disply name without an object instance?如何在没有对象实例的情况下获取 Encore 功能显示名称?
【发布时间】:2023-04-02 11:40:01
【问题描述】:

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

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

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

如果我有一个类的实例,那么我可以使用适配器工厂来获取可以执行此操作的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。但这似乎有点像黑客。有没有更好的解决方案?

【问题讨论】:

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


    【解决方案1】:

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

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

    如果你在编译时不知道类,但在运行时只有一个EClass 实例,事情就更复杂了,因为必要的方法是受保护的。您必须先将它们“公开”。

    我会将各自的方法添加到生成的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);
    }
    

    现在您可以像这样为EClass theEClass 创建一个ItemProviderAdapter

    provider = (ItemProviderAdapter) adapterFactory.getModelSwitch()
            .doPublicSwitch(theEClass, null);
    

    EMF 显然不是为此而生的。请记住,这一切只有在您没有任何使用 EObject 值的自定义提供程序实现时才有效。

    【讨论】:

    • 感谢您的意见。我不知道有一个生成的模型开关,这可能会派上用场。
    • 另外一个问题是我的模型被分成了三个独立的项目,有独立的模型文件和独立的适配器工厂。我想编写与这些子模型中的任何一个通用的代码。您的解决方案也许可以通过一些自定义代码来执行此操作,但这是一个额外的麻烦。
    • 考虑到所有因素,我认为我更喜欢创建虚拟对象并使用adaptorFactory.adapt(dummy, IItemPropertySource.class) 的解决方案。 (adaptorFactory 这里是一个包含所有相关特定工厂的组合适配器工厂。)
    • 是的,当然,您总是可以创建一个 EClass 的空实例并使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多