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;

カスタムの 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 がサポートされている言語のコードをシリアル化する方法を理解できませんでした。

この問題を解決するには?

-本当にありがとう

だってばよ

4

2 に答える 2

1

早速のお返事ありがとうございます。

解決策を見つけました。

私が必要としていたのは、プロパティ アクセスを含むコードを生成し、.NET 型のコードを生成することでした。

プロパティにアクセスするコードを生成するには、CodePropertyReferenceExpression を使用する必要があります。これにより、Line2 に関する問題が解決されます。

Type を含むコードを生成するには、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

これが役立つかどうかはわかりませんが、.Net で記述された多言語コード ジェネレーターであるMyGenerationを見たことがありますか。CodeDomSerializer は使用しませんが、適切なコードを生成します。車輪を再発明することなく、根本的な問題を解決できるのではないでしょうか?

于 2009-02-13T06:11:28.640 に答える