1

以下のコードは、プリミティブ式で正常に機能します(驚くことではありません)

public class SiteContextExpressionBuilder : ExpressionBuilder {
   public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context) {
      PropertyInfo property = typeof(SiteContext).GetProperty(entry.Expression);
      return new CodePrimitiveExpression(property.GetValue(null, null)));
   }
}

ここで、非プリミティブ型も返したいと思います。Companyオブジェクトとしましょう。
それはどのように機能しますか?良い例が見つからないようです。

無効なプリミティブ型:...CodeObjectCreateExpressionの使用を検討してください

CodeObjectCreateExpressionまたは代替を実装するにはどうすればよいですか?

4

2 に答える 2

2

Companyオブジェクトのコンストラクターがどのように見えるかわからないので、Sizeを使用した例を次に示します。

コンストラクタ

new Size(640, 400)

CodeObjectCreateExpressionを使用

CodeExpression newSizeExpr = new CodeObjectCreateExpression(new CodeTypeReference(“System.Drawing.Size”),
   new CodePrimitiveExpression(640), new CodePrimitiveExpression(400));

Companyコンストラクターがプリミティブ引数を受け入れる場合は、上記の例のようにCodePrimitiveExpressionsを使用できます。非プリミティブ型が必要な場合は、CodePrimitiveExpressionsを使用してそれらの非プリミティブ型をインスタンス化できます。Companyオブジェクトを作成するために必要なものが揃うまで繰り返します。

更新:ソースが役立つ場合があります:http://blogs.msdn.com/bclteam/archive/2006/04/10/571096.aspx

于 2010-02-21T05:53:03.947 に答える
1

プロパティを使用するための CodePropertyReferenceExpression やインスタンスを取得するための CodeVariableReferenceExpression など、CodeExpression のサブクラスを確認する必要があります。

CodeExpressions は、言語に依存しないステートメントと式の低レベル表現です。同等の C# ステートメントを非常に基本的なコンポーネントに分解する必要があります。

于 2010-02-25T09:04:49.083 に答える