既存のパラメータまたは変数を返す場合にこれを行う方がはるかに簡単です。ブロック式の最後のステートメントが戻り値になります。 ParameterExpressionを最後に含めて、返すことができます。
public struct StructType
{
public byte Field1;
public short Field2;
}
次に、あなたのコードは次のようになります:それが動作することを
var readerType = typeof(BinaryReader);
var structType = typeof(StructType);
var readerParam = Expression.Parameter(readerType);
var structVar = Expression.Variable(structType);
var expressions = new List<Expression>();
expressions.Add(
Expression.Assign(
Expression.MakeMemberAccess(structVar, structType.GetField("Field1")),
Expression.Call(readerParam, readerType.GetMethod("ReadByte"))
)
);
expressions.Add(
Expression.Assign(
Expression.MakeMemberAccess(structVar, structType.GetField("Field2")),
Expression.Call(readerParam, readerType.GetMethod("ReadInt16"))
)
);
expressions.Add(structVar); //This is the key. This will be the return value.
var ReadStruct = Expression.Lambda<Func<BinaryReader, StructType>>(
Expression.Block(new[] {structVar}, expressions),
readerParam).Compile();
テスト:あなたの構造体を仮定し
はこのようなものです
var stream = new MemoryStream(new byte[] {0x57, 0x46, 0x07});
var reader = new BinaryReader(stream);
var struct1 = ReadStruct(reader);
それは、この例を言及する価値がありますStructTypeが構造体の場合に機能します。クラスの場合は、コンストラクタを呼び出して、BlockExpressionのstructVarを最初に初期化します。
出典
2012-10-23 18:30:20
Ben
これは実際に違いがあるので、これらのv3またはv4の表現ツリーですか?また、ツリーで表現しようとしているコードの例を表示できますか? –
v4の表現ツリー。コードを追加するように編集しました。 – thecoop