如何访问EMF模型的某些EStructuralFeatures?

时间:2013-11-08 19:51:58

标签: attributes eclipse-emf emf

我知道有些方法可以通过EAttribute或其名称通过不同的间接方法访问Eclipse {EM}模型的featureID。为此,我找到了以下内容:Eclipse EMF: How to get access EAttribute by name?

但是,如果我不知道我想要的属性的名称怎么办?假设,根据设计,模型具有开发人员的一些固定属性,以及可由用户动态设置的功能。

因此,暂时我使用getEAllStructuralFeatures()并通过get()使用索引来访问用户创建的属性,因为我知道我得到的列表将具有将模型的固定属性作为以索引0开头的第一个元素。但我发现这个解决方案不清楚且效率低下。在某些情况下,我想工作,不适合。

例如:IEMFEditProperty prop = EMFEditProperties.list(editingDomain, EMFMODELPackage.Literals.EMFMODEL.getEAllStructuralFeatures().get(X));

您是否知道此问题的解决方案或解决方法?据我所知,没有直接的方法可以获得模型的动态创建功能。

我们将不胜感激。

1 个答案:

答案 0 :(得分:5)

我最近一直在研究一个类似的案例,我首先尝试定义一个EStructuralFeature来准确访问我需要的对象的设置/属性。

但是如果你看一下ECore内部的工作方式,你会发现,这种方法无法工作,因为索引绑定到运行时创建的EStructuralFeature个对象的对象标识对于特定的上下文(即EClass实例)。

我的方法是检查EClass.getEAllStructuralFeatures提议的功能,或者迭代功能并检查EObject.eGet返回的对象,以获取此功能(EClass eClass = eObject.eClass())。< / p>

示例:在UML配置文件中,我定义了一个名为“Bean”的UML Stereotype,其中包含一个名为FactoryEntity的属性。该属性应引用具有最接近此bean的Stereotype“Entity”的UML类,并为其生成静态工厂方法。

enter image description here

在模型中,我将有一个类型为Bean的UML类和一个实体。

enter image description here

对于类型为“Bean”的类,我会为配置文件中定义的属性/属性factoryEntity设置一个值。

enter image description here

那么问题是如何在ECore中访问属性值。我最终迭代了EObject的EClass的可用EStructuralFeature列表并检查eGet返回的对象的类型。

final EObject eObject = (EObject) holdingClass.getValue(stereotype, stereoTypePropertyName);

final EList<EStructuralFeature> allEStructFeats = eObject.eClass().getEAllStructuralFeatures();

for(EStructuralFeature esf : allEStructFeats)
{
    final Object o = eobject.eGet(esf);

    if(o instanceof org.eclipse.uml2.uml.Class)
    {
        return (org.eclipse.uml2.uml.Class) o;
    }
}

也许这不是获取结构特征的最优雅方式,但它是我认为唯一能够持久耐用的方法。

如果您对如何改进此建议有任何建议,请与我们联系。