我正在使用自定义 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 支持的语言进行代码序列化。
如何解决这个问题呢?
-非常感谢
达特巴约