カスタム 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;
カスタムの CodeDomSerializer FOR C# 言語を作成することで、設計時に前述のコードを生成することに成功しました。
しかし、C++ 言語でアプリケーションを開発するために MyControl を使用すると、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++ デザイナーによって生成されたコードには、ScopeResolution 用の '::' 演算子 (DOT ではない) と Pointer-To-Member 解決用の '->' が必要です。CLR がサポートされている言語のコードをシリアル化する方法を理解できませんでした。
この問題を解決するには?
-本当にありがとう
だってばよ