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