我知道有些方法可以通过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));
您是否知道此问题的解决方案或解决方法?据我所知,没有直接的方法可以获得模型的动态创建功能。
我们将不胜感激。
答案 0 :(得分:5)
我最近一直在研究一个类似的案例,我首先尝试定义一个EStructuralFeature
来准确访问我需要的对象的设置/属性。
但是如果你看一下ECore内部的工作方式,你会发现,这种方法无法工作,因为索引绑定到运行时创建的EStructuralFeature
个对象的对象标识对于特定的上下文(即EClass
实例)。
我的方法是检查EClass.getEAllStructuralFeatures
提议的功能,或者迭代功能并检查EObject.eGet
返回的对象,以获取此功能(EClass eClass = eObject.eClass()
)。< / p>
示例:在UML配置文件中,我定义了一个名为“Bean”的UML Stereotype,其中包含一个名为FactoryEntity
的属性。该属性应引用具有最接近此bean的Stereotype“Entity”的UML类,并为其生成静态工厂方法。
在模型中,我将有一个类型为Bean的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;
}
}
也许这不是获取结构特征的最优雅方式,但它是我认为唯一能够持久耐用的方法。
如果您对如何改进此建议有任何建议,请与我们联系。