5

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

但是如果我不知道我想要获取的属性的名称怎么办?比方说,根据设计,模型有一些开发者固定的属性,以及可以由用户动态设置的特性。

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

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

您知道此问题的解决方案或解决方法吗?据我所知,没有直接的方法可以获取模型的这种动态创建的特征。

每一个帮助将不胜感激。

4

1 回答 1

5

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

但是,如果您查看 ECore 内部的工作方式,您会发现,这永远不会起作用,因为索引绑定到EStructuralFeature在运行时为特定上下文(即EClass实例)创建的对象的对象身份.

然后,我的方法是检查由提出的功能EClass.getEAllStructuralFeatures或迭代功能并检查由EObject.eGet该功能返回的对象(其中EClass eClass = eObject.eClass())。

示例:在 UML 配置文件中,我定义了一个名为“Bean”的 UML Stereotype,其属性名为FactoryEntity. 该属性应引用一个具有构造型“实体”的 UML 类,该类最接近这个 bean,并且将为其生成一个静态工厂方法。

在此处输入图像描述

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

在此处输入图像描述

然后对于键入为“Bean”的类,我将为factoryEntity配置文件中定义的属性/属性设置一个值。

在此处输入图像描述

问题是如何在 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;
    }
}

也许这不是访问结构特征的最优雅的方式,但它是我认为唯一一种足够健壮的方式。

如果您对如何改进这一点有任何建议,请告诉我。

于 2013-11-18T14:08:47.007 回答