0

Expression<Func<MyObject, object>>のメソッドを呼び出して拡張したいを受け取るメソッドがありobjectます。拡張式の結果は常にbool. 本質的に私はに「変換」Expression<Func<MyObject, object>>したいExpression<Func<MyObject, bool>>

ここに私がやりたいことの要点があります。これは、 ではなくReportExprのタイプのようにコンパイルされないことを認識していますが、これは意図を伝えていると思います。Expression<Func<MyObject, bool>>MethodCallExpression

private MyObjectData CreateMyObjectData(string description, 
    FieldTypes fieldType, Expression<Func<MyObject, object>> expression)
{
    var data= new MyObjectData()
    {
        ReportDesc = description,
        FieldType = fieldType,
    };

    var method = typeof(DateTime?).GetMethod("Between");
    Expression<Func<MyObject, DateTime?>> from = x => x.FromValue as DateTime?;
    Expression<Func<MyObject, DateTime?>> to = x => x.ToValue as DateTime?;
    var methodCallExpression = Expression.Call(expression, method, from, to);
    data.ReportExpr = methodCallExpression;
    return data;
}
4

1 に答える 1

0

(Customer c) => c.SomeDateTimeからに行きたいとし(Customer c) => Between(c.SomeDateTime, a, b)ます。デバッガーでサンプル式を見て、それらがどのように構造化されているかを確認してください。

式に定数が含まれていません。パラメータが含まれていますc。パラメータを再利用できます。

var cParam = expression.Parameters[0];

次に分離しc.SomeDateTimeます。

var memberAccess = expression.Body;

次に、新しい本体を作成します。

Expression.Call(
    "Between",
    memberAccess,
    Expression.Constant(DateTime.Now),
    Expression.Constant(DateTime.Now));

次は新しいラムダです。

var lambda = Expression.Lambda<Func<Customer, bool>>(cParam, body);

私が何かを忘れていたとしても、あなたは今それを理解することができます.

于 2013-08-09T14:42:51.967 に答える