1

我正在使用自定义 CodeDomSerializer 在设计时为 WindowsForm 控件实现代码生成。

这就是我所拥有的。

  • 一个用户控件,即用 C# 编写的 MyControl。
  • MyControl 有一个 ObjectXXX 类型的属性 MyControlProperty,可公开访问。(如 myControl.MyControlProperty)。
  • ObjectYYY 类型有一个 Collection 类型的公共属性 PropertyXXX。
  • ObjectXXX 有一个 ObjectYYY 类型的内部字段。
  • ObjectXXX 应该通过传递 Collection(只不过是 ObjectYYY.PropertyXXX)来初始化。

生成的代码应该在下面的代码片段中给出。

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

通过为 C# 语言编写自定义 CodeDomSerializer,我成功地在设计时生成了上述代码。

但是,如果我使用 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

对于线路 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++ Designer 生成的代码应该有 '::' 运算符(而不是 DOT)用于 ScopeResolution 和 '->' 用于 Pointer-To-Member 分辨率。我无法弄清楚如何为任何 CLR 支持的语言进行代码序列化。

如何解决这个问题呢?

-非常感谢

达特巴约

4

2 回答 2

1

感谢您的快速回复。

我找到了解决方案。

我需要的是生成包含属性访问的代码并为 .NET 类型生成代码。

要生成访问属性的代码,应该使用 CodePropertyReferenceExpression。这解决了我对 Line2 的问题。

要生成包含类型的代码,应该使用 Code CodeTypeReferenceExpression。这结合 CodePropertyReferenceExpression 解决了 Line1 的问题。

现在,我能够正确地生成使用中的语言的代码。

//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;
于 2009-02-13T09:00:19.217 回答
0

不确定这是否会有所帮助,但您是否看过MyGeneration ,它是一个用 .Net 编写的多语言代码生成器。它不使用 CodeDomSerializer,但它确实生成了很好的代码——也许它可以解决你的潜在问题而无需重新发明轮子?

于 2009-02-13T06:11:28.640 回答