2009-02-13 18 views
1

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

+0

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

Répondre

1

Merci pour la réponse rapide.

J'ai trouvé la solution. Ce dont j'avais besoin, c'était de générer du code contenant l'accès aux propriétés et de générer du code pour les types de .NET.

Pour générer du code accédant à une propriété, vous devez utiliser CodePropertyReferenceExpression. Cela résout mon problème avec Line2.

Pour générer du code contenant un type, il faut utiliser Code CodeTypeReferenceExpression. Ceci combiné avec CodePropertyReferenceExpression a résolu le problème avec Line1.

Maintenant, je suis en mesure de générer le code correctement w.r.t. la langue utilisée.

//For C# The code would be 
NamespaceX.NamespaceY.ObjectXXX x = new NamespaceX.NamespaceY.ObjectXXX(NamespaceX.NamespaceY.ObjectYYY.PropertyXXX); 
this.myControl.MyControlProperty = x; 

//For C++ The code would be 
NamespaceX::NamespaceY::ObjectXXX x = new NamespaceX::NamespaceY::ObjectXXX(NamespaceX::NamespaceY::ObjectYYY::PropertyXXX); 
this->myControl->MyControlProperty = x; 
0

Je ne sais pas si cela va aider, mais avez-vous regardé son MyGeneration un générateur de code écrit en plusieurs langues .Net. Il n'utilise pas CodeDomSerializer, mais il génère du bon code - peut-être cela va-t-il résoudre votre problème sous-jacent sans avoir à réinventer la roue?