如何访问EMF模型的特定EStructuralFeatures?

5
我知道有几种通过不同的间接方法访问Eclipse EMF模型的EAttribute的方式,可以通过其featureID或名称。对此,我找到了以下内容:Eclipse EMF:如何按名称获取EAttribute访问? 但是如果我不知道要获取的属性的名称呢?假设,根据设计,该模型由开发人员提供一些固定属性,以及用户可以动态设置的特性。
因此,暂时我使用getEAllStructuralFeatures()并通过get()使用索引来到达由用户创建的属性,因为我知道所得到的列表将具有模型的固定属性作为其第一个元素,从索引0开始。但是我发现这个解决方案不清晰和低效。在某些情况下,它也不适用。
例如:IEMFEditProperty prop = EMFEditProperties.list(editingDomain, EMFMODELPackage.Literals.EMFMODEL.getEAllStructuralFeatures().get(X));

你知道解决这个问题的方法或者解决方案吗?据我所知,没有直接的方法来获取模型中动态创建的这些特性。

非常感谢你的帮助。

1个回答

6

最近我处理了一个类似的案例,首先尝试定义一个EStructuralFeature来访问所需对象的设置/属性。

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

我的方法是检查EClass.getEAllStructuralFeatures提供的功能或遍历功能并检查由EObject.eGet返回的对象(其中EClass eClass = eObject.eClass())。

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

enter image description here

然后,在模型中,我将一个UML Class类型为Bean和一个类型为Entity。

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;
    }
}

也许这不是最优雅的访问结构特征的方式,但我认为它是唯一一个足够强大以持久存在的方式。如果您对如何改进此方法有任何建议,请告诉我。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接