我在設計時使用自定義CodeDomSerializer實現了WindowsForm控件的代碼生成。使用CodeDomSerializer爲所有CLR支持的語言生成代碼
這是我的。
- 用戶控件,即MyControl在C#中編寫的 。
- MyControl有一個屬性 可以公開訪問的ObjectXXX 類型的MyControlProperty(如 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和指針 - 成員操作符進行序列化。
我在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
對於2號線,
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支持的語言製作代碼序列化。
如何解決這個問題?
-Thanks一堆
Dattebayo
注意的DOM(屁股不是原始測試)工作CodeDomSerializer API是相當解散的這些天,因爲它沒有得到充分的更新,以支持添加到C#3.0的語法,並沒有嚴重支持在所有不太常見的CLR語言。 – ShuggyCoUk 2009-02-13 10:41:04