0

我正在尝试编写一个 DSL 来进行从一个对象到另一个对象的类型安全转换。

src classA
dst classB

map valueA to valueB with ConverterX
map valueC to valueD with ConverterY

结果应该是这样的:

class Converter
{
public void convert(ClassA a, ClassB b)
{
 a.setValueA(ConverterX.convert(b.getValueB))
 b.setValueC(ConverterY.convert(b.getValueD))

}
}

我只是想为此生成代码,但我无法访问我已经定义的类。这样做的原因是能够使用默认转换器。只有在我能够获得参数类型的情况下,我才能选择默认转换器的实现。

4

2 回答 2

1

您可以按照 Xtext 文档的建议坚持使用 JvmTypeReference。您可以从 jvmTypeRef.getType() 获取 JvmType,其中相关类型可转换为 JvmDeclaredType。这是我使用 JvmTypeReference 获取所有 bean 属性(类成员)列表的辅助方法:

public List<String> getFieldNamesForClass(JvmTypeReference jvmTypeRef) {
    List<String> result = new ArrayList<String>();
    if (jvmTypeRef.getType() instanceof JvmDeclaredType) {
        JvmDeclaredType declaredType = (JvmDeclaredType)jvmTypeRef.getType();
        for (JvmField field : declaredType.getDeclaredFields()) {
            result.add(field.getSimpleName());
        }
    }
    return result;
}

输出是字符串列表,即文件名,但可以轻松更改为返回 JvmField/JvmMember 实例。

在 bitbucket.org/espinosa/deepclonedsl 上检查我的 DeepCloneDSL

于 2012-12-17T00:24:37.787 回答
0

我通过使用 JvmDeclaredType 代替 JvmTypeReference 解决了这个问题。JvmTypeReference 不提供对字段和方法的访问,但 JvmDeclaredType 提供。也可以通过知道 JvmDeclaredType 中存在的 QualifiedName 来生成 JvmTypeReference。

于 2012-09-17T13:05:28.487 回答