我正在尝试编写一个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))
}
}
我只想为此生成代码,但我无法访问已定义的类。原因是能够使用默认转换器。只有在我能够获得参数类型的情况下,我才能选择默认转换器的实现。
答案 0 :(得分:1)
您可以坚持使用JvmTypeReference,因为Xtext文档建议。您可以从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
答案 1 :(得分:0)
我通过使用JvmDeclaredType的JvmTypeReference实例解决了这个问题。 JvmTypeReference不提供对字段和方法的访问,但JvmDeclaredType可以访问。通过了解JvmDeclaredType中存在的QualifiedName,也可以生成JvmTypeReference。