0

例如:

型号 1:

abstract class Command{} 

型号 2:

class Command1 extends Command{ ...}
class Command2 extends Command{ ...}

模型 3:

class CommandHolder {
 val Command[+] commands;
}

现在我为 Model3 生成编辑器,并希望 Command1 和 Command2 可以选择为 CommandHolder 元素的子元素。

这意味着,如果我创建一个以 commands 元素作为根元素的 CommandHolder 文件并右键单击它并选择 [New Child],我希望 Command1 和 Command2 出现在此列表中。

在不更改生成的源代码的情况下这可能吗?

问候

4

1 回答 1

0

因此,如果不更改生成的代码,我无法实现它,但我有一个可行的解决方案。

在我添加的 CommandHolder 的 collectNewChildDescriptors 方法中的特定项目提供程序中

 List<EClass> cmdClasses = EcoreHelper.getAllClassesInheritFrom("Command");
    for(EClass cmdClass : cmdClasses){
        newChildDescriptors.add
        (createChildParameter
            (CommandPackage.Literals.COMMAND__COMMANDS,
             EcoreHelper.createClassByName(cmdClass.getName())));
    }

EcoreHelper 方法:

public static EObject createClassByName(String className) {

        EObject eObject = null;
        try {
            Registry registry = EPackage.Registry.INSTANCE;
            for (String key : new HashSet<String>(registry.keySet())) {
            EPackage ePackage = registry.getEPackage(key);
            if (ePackage.getClass().getName().startsWith("")) {
                for (EClassifier eClassifier : ePackage.getEClassifiers()) {
                if (eClassifier instanceof EClass) {
                    EClass eClass = (EClass) eClassifier;
                    if (eClass.getName().equals(className)) {
                    if (!eClass.isAbstract()) {
                        eObject = ePackage.getEFactoryInstance().create(eClass);
                    }
                    }
                }
                }
            }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return eObject;
        }


 public static List<EClass> getAllClassesInheritFrom(String className) {
        List<EClass> eClasses = new ArrayList<EClass>();
        try {
            Registry registry = EPackage.Registry.INSTANCE;
            for (String key : new HashSet<String>(registry.keySet())) {
            EPackage ePackage = registry.getEPackage(key);
            if (ePackage.getClass().getName().startsWith("")) {
                for (EClassifier eClassifier : ePackage.getEClassifiers()) {
                if (eClassifier instanceof EClass) {
                    EClass eClass = (EClass) eClassifier;
                    if (eClass.getName().equals(className)) {
                    if (!eClass.isAbstract()) {
                        eClasses.add(eClass);

                    }
                    } else {
                    for (EClass bla : eClass.getEAllSuperTypes()) {
                        if (bla.getName().equals(className)) {
                        if (!eClass.isAbstract()) {
                            eClasses.add(eClass);
                        }
                        }
                    }
                    }
                }
                }
            }
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return eClasses;
        }
于 2013-12-13T07:35:18.513 回答