J'implémente le contrôle de génération de code pour WindowsForm à la conception, en utilisant un CodeDomSerializer personnalisé.Génération de code pour tout langage pris en charge par CLR à l'aide d'un CodeDomSerializer
Voici ce que j'ai.
- Un contrôle utilisateur, c'est-à-dire MyControl écrit en C#.
- MyControl a une propriété MyControlProperty de type ObjectXXX qui est accessible au public (comme myControl.MyControlProperty).
- Le type ObjectYYY a une propriété publique PropertyXXX de type Collection.
- L'ObjectXXX possède un champ interne de type ObjectYYY.
- L'ObjectXXX doit être initialisé en transmettant Collection (lequel n'est rien d'autre que ObjectYYY.PropertyXXX).
Le code généré doit être tel qu'il est indiqué dans l'extrait de code ci-dessous.
Line1. NamespaceX.NamespaceY.ObjectXXX x = new NamespaceX.NamespaceY.ObjectXXX(NamespaceX.NamespaceY.ObjectYYY.PropertyXXX);
Line2. myControl.MyControlProperty = x;
je réussi à générer le code mentionné ci-dessus au moment du design en écrivant une coutume CodeDomSerializer POUR langage C#. Mais, si j'utilise MyControl pour développer une application en langage C++, l'opérateur DOT est sérialisé pour ScopeResolution et l'opérateur Pointer-To-Member.
Ce que je fais pour le code en ligne 1 est,
string fullyQualifiedName = "NamespaceX.NamespaceY.ObjectYYY.PropertyXXX"; // HERE VARIABLE NAME IS HARDCODED WITH TWO TYPES OF OPERATORS
CodeExpression[] parameters = new CodeExpression[] {new CodeVariableReferenceExpression(fullyQualifiedName);};
CodeStatement code = new CodeVariableDeclarationStatement(typeof(ObjectXXX), "objectXXX1", new CodeObjectCreateExpression(new CodeTypeReference(typeof(ObjectXXX)), parameters));
generatedCode.Add(code); //generatedCode has the final code
Pour Line2,
CodeExpression codeLhs = new CodeVariableReferenceExpression(myControlVariable + "." + "MyControlProperty"); // HERE Pointer-To-Member IS HARDCODED AS DOT
CodeExpression codeRhs = new CodeVariableReferenceExpression("objectXXX1");
CodeAssignStatement codeAssignStmt = new CodeAssignStatement(codeLhs, codeRhs);
generatedCode.Add(codeAssignStmt); //generatedCode has the final code
Il est évident que le concepteur du C généré code devrait avoir '::' opérateur (et non DOT) pour ScopeResolution et '->' pour la résolution Pointer-To-Member. Je n'étais pas capable de comprendre comment faire la sérialisation du code pour n'importe quelle langue prise en charge par CLR.
Comment résoudre ce problème?
-Merci un groupe
Dattebayo
Notez que le api CodeDomSerializer travaillant sur le DOM (cul opposé à un test brut) est de nos jours plutôt défunte car il n'a pas été suffisamment mis à jour pour les ajouts à c syntaxe # 3.0 et ne supporte pas sérieux du tout les langages CLR moins communs. – ShuggyCoUk