Я реализую генерацию кода для элемента управления 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