Генерация кода для всех языков, поддерживаемых CLR, с использованием CodeDomSerializer - PullRequest
1 голос
/ 13 февраля 2009

Я реализую генерацию кода для элемента управления WindowsForm во время разработки с использованием пользовательского CodeDomSerializer.

Вот что у меня есть.

  • Пользовательский элемент управления, т. Е. MyControl, написанный в C #.
  • MyControl имеет свойство MyControlProperty типа ObjectXXX это доступно публично. (как myControl.MyControlProperty).
  • Тип ObjectYYY имеет публичное свойство PropertyXXX типа Коллекция.
  • ObjectXXX имеет внутреннее поле типа ObjectYYY.
  • ObjectXXX должен быть инициализирован путем передачи Collection (который не что иное, как ObjectYYY.PropertyXXX).

Сгенерированный код должен соответствовать приведенному ниже фрагменту кода.

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

Мне удалось сгенерировать вышеупомянутый код во время разработки, написав собственный язык CodeDomSerializer FOR C #.

Но если я использую MyControl для разработки приложения на языке C ++, оператор DOT сериализуется как для оператора ScopeResolution, так и для оператора Pointer-To-Member.

То, что я делаю для кода в строке 1,

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

Для 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

Очевидно, что сгенерированный в C ++ Designer код должен иметь оператор «::» (а не DOT) для ScopeResolution и «->» для разрешения «Указатель на член». Я не смог понять, как выполнить сериализацию кода для любого языка, поддерживаемого CLR.

Как решить эту проблему?

-Спасибо

Dattebayo

Ответы [ 2 ]

1 голос
/ 13 февраля 2009

Спасибо за быстрый ответ.

Я нашел решение.

Мне нужно было генерировать код, содержащий доступ к свойствам, и генерировать код для типов .NET.

Для создания кода, который обращается к свойству, следует использовать CodePropertyReferenceExpression. Это решает мою проблему с Line2.

Для генерации кода, который содержит тип, следует использовать Code CodeTypeReferenceExpression. Это в сочетании с CodePropertyReferenceExpression решило проблему с Line1.

Теперь я могу правильно сгенерировать код w.r.t. Используемый язык.

//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 голосов
/ 13 февраля 2009

Не уверен, поможет ли это, но вы смотрели на MyGeneration , это многоязычный генератор кода, написанный на .Net. Он не использует CodeDomSerializer, но генерирует хороший код - может быть, он решит основную проблему без необходимости заново изобретать колесо?

...