2009-02-13 66 views
1

我在設計時使用自定義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

+0

注意的DOM(屁股不是原始測試)工作CodeDomSerializer API是相當解散的這些天,因爲它沒有得到充分的更新,以支持添加到C#3.0的語法,並沒有嚴重支持在所有不太常見的CLR語言。 – ShuggyCoUk 2009-02-13 10:41:04

回答

1

感謝您的快速回復。

我找到了解決方案。

我需要的是生成代碼包含屬性訪問和生成.NET類型的代碼。

要生成訪問屬性的代碼,應該使用CodePropertyReferenceExpression。這解決了我在Line2上的問題。

要生成包含Type的代碼,應該使用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,但它確實生成了很好的代碼 - 也許它可以解決您的基礎問題,而無需重新發明輪子?