Как получить отображаемое имя функции 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. Но это немного похоже на взлом. Нет ли лучшего решения?


person Lii    schedule 18.10.2016    source источник


Ответы (1)


Если вы знаете класс во время компиляции, вы можете создать ItemProviderAdapter самостоятельно:

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

Если вы не знаете класс во время компиляции, но имеете только экземпляр EClass во время выполнения, все сложнее, потому что необходимые методы защищены. Вы должны сначала «сделать» их общедоступными.

Я бы добавил соответствующие методы в сгенерированные классы MyPackageSwitch и MyPackageAdapterFactory (в myPackage.util).

In MyPackageAdapterFactory:

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

In MyPackageSwitch:

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

Теперь вы можете создать ItemProviderAdapter для EClass theEClass следующим образом:

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

ЭМП явно не для этого делали. Имейте в виду, что все это работает только в том случае, если у вас нет пользовательских реализаций поставщиков, использующих значения EObject.

person Markus    schedule 20.10.2016
comment
Спасибо за отзыв. Я не знал, что есть сгенерированный переключатель модели, который может когда-нибудь пригодиться. - person Lii; 20.10.2016
comment
Еще одна проблема заключается в том, что моя модель разделена на три отдельных проекта с отдельными файлами моделей и отдельными фабриками адаптеров. Я хочу написать код, который в целом работает с любой из этих подмоделей. Возможно, ваше решение может быть адаптировано для этого с помощью некоторого пользовательского кода, но это дополнительные хлопоты. - person Lii; 20.10.2016
comment
Учитывая все обстоятельства, я думаю, что предпочитаю решение для создания фиктивного объекта и использования adaptorFactory.adapt(dummy, IItemPropertySource.class). (adaptorFactory здесь представлена ​​составная фабрика адаптеров, содержащая все соответствующие конкретные фабрики.) - person Lii; 20.10.2016
comment
Да, конечно, вы всегда можете просто создать пустой экземпляр EClass и использовать его. - person Markus; 20.10.2016