2009-02-13 5 views
1

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

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

  • Пользовательское управление i.e MyControl написано в C#.
  • MyControl имеет свойство MyControlProperty типа ObjectXXX , доступный публично. (Например, myControl.MyControlProperty).
  • Тип ObjectYYY имеет общественное имущество PropertyXXX типа Collection.
  • Объект ObjectXXX имеет внутреннее поле типа ObjectYYY.
  • ObjectXXX должен быть инициализирован передачей Collection (который - это ничего, кроме ObjectYYY.PropertyXXX).

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

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

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

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

Что я делаю для кода в Line1 есть

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++ конструктор сгенерированный код должен иметь '::' оператора (а не DOT) для ScopeResolution и '->' для разрешения указателя-члена. Мне не удалось выяснить, как сделать сериализацию кода для любого языка, поддерживающего CLR.

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

-Благодаря кучу

Dattebayo

+0

Обратите внимание, что апи CodeDomSerializer работает на DOM (задница против сырого теста) довольно несуществующие в эти дни, так как она не была должным образом обновлена ​​для поддержки дополнения к C# 3.0 синтаксиса и не имеет серьезную поддержки на все в менее распространенные языки CLR. – ShuggyCoUk

ответ

1

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

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

Что мне нужно, это генерировать код, содержащий доступ к свойствам и генерирующий код для типов .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

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