我的metamodel中有两个Eclasses(称为X和Y),它们之间有一个包含(X包含Y)关系,下限为0,上限为1。
我需要在我的.mtl文件中知道用户是否添加了这个Y的实例才能添加一些代码。 像这样的尝试失败了:
[if (X.relationname.oclIsUndefined() = false)]
[if (X.relationname <> null)]
提前致谢,如果您需要任何额外信息,请与我们联系。
答案 0 :(得分:1)
这取决于你的遏制关系;它是否为多值(它的“upperBound”设置为“-1”,即它可以保持任意数量的Y)或monovalued(其“upperBound”为“1”或不变,它只能容纳一个Y)。
如果是多值,则引用永远不会为“null”(或“oclIsUndefined”)。当它不包含单个Y时,它将是一个空列表,因此您需要检查大小:
[if (not X.relationname.isEmpty())]
否则,对于monovalued参考,您可以检查null
(您在答案中所做的事情似乎表明您的情况就是这样):
[if (not X.relationname.oclIsUndefined())]
相反,你在答案中所做的有点不同:
[if((X.relationname.attributename->size()).oclIsUndefined() <> true)]
这实际上将检索与您的X关联的Y并访问其属性值。如果没有“Y”,则不会是null
:它将是“无效”,即它将失败。当然,“oclInvalid”(“失败”对象)与“true”不同,所以你的“&lt;&gt;”工作......即使它很笨重(你通常使用“not”操作而不是测试一个布尔值)。
答案 1 :(得分:0)
解决方案:
我终于解决了:
[if((X.relationname.attributename->size()).oclIsUndefined() <> true)]
这不是最好的解决方案,但它可以解决问题。该属性是一个EString。