Generación de código para Todos lenguaje CLR soportado mediante un CodeDomSerializer

StackOverflow https://stackoverflow.com/questions/544884

  •  23-08-2019
  •  | 
  •  

Pregunta

Me estoy poniendo en práctica la generación de código para el control WindowsForm en tiempo de diseño, el uso de un CodeDomSerializer personalizado.

Esto es lo que tengo.

  • Un control de usuario es decir MyControl escrito Cía#.
  • MyControl tiene una propiedad MyControlProperty de tipo ObjectXXX que es accesible al público. (como myControl.MyControlProperty).
  • El tipo ObjectYYY tiene una propiedad pública PropertyXXX de tipo Collection.
  • El ObjectXXX tiene un campo interno de tipo ObjectYYY.
  • El ObjectXXX debe ser inicializado al pasar Collection (que no es más que ObjectYYY.PropertyXXX).

El código generado debe ser como se da en el fragmento de código a continuación.

Line1. NamespaceX.NamespaceY.ObjectXXX x = new NamespaceX.NamespaceY.ObjectXXX(NamespaceX.NamespaceY.ObjectYYY.PropertyXXX);
Line2. myControl.MyControlProperty = x;

tuve éxito en la generación del código mencionado en tiempo de diseño escribiendo una costumbre CodeDomSerializer PARA lenguaje C #.

Pero, si yo uso MyControl para el desarrollo de una aplicación en lenguaje C ++, el operador punto es serializado tanto para ScopeResolution y puntero a miembro del operador.

Lo que estoy haciendo para el código en línea 1 es,

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

Para 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

Es evidente que el C ++ Diseñador generada código debe tener '::' operador (y no DOT) para el ScopeResolution y '->' para la resolución de puntero a miembro. Yo no era capaz de encontrar la manera de hacer que el código de serialización para cualquier lenguaje CLR soportado.

¿Cómo resolver este problema?

-Gracias un manojo

Dattebayo

¿Fue útil?

Solución

Gracias por la rápida respuesta.

he encontrado la solución.

Lo que necesito estaba generando código que contiene acceso a la propiedad y la generación de código para los tipos de .NET.

Para generar el código que tiene acceso a una propiedad, se debe utilizar CodePropertyReferenceExpression. Esto resuelve mi problema con la línea 2.

Para generar código que contiene un tipo, se debe utilizar Código CodeTypeReferenceExpression. Esto, combinado con CodePropertyReferenceExpression resolvió el problema con Line1.

Ahora, yo soy capaz de generar código correctamente w.r.t. la lengua en uso.

//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;

Otros consejos

No está seguro de si esto ayuda, pero ¿has mirado en MyGeneration es una generador de código multi idioma escrito en .Net. No utiliza CodeDomSerializer, pero sí generar buen código - tal vez va a resolver su problema de fondo sin tener que volver a inventar la rueda

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top