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