0

式を作成したい:x => x.Date >= SomeDate

しかし、それは次のコードx => ( x.Date >= SomeDate )です。私が推測できる括弧のために、まったく機能しません。

Expression<Func<T, DateTime>> expression = x => x.Date;

var date= new DateTime(2013, 8, 22);

ParameterExpression param = Expression.Parameter(typeof(T), "x");
Expression lambda = Expression.Lambda<Func<T, bool>>(
Expression.GreaterThanOrEqual(expression.Body,
Expression.Constant(date, typeof(DateTime))), param);

var valueExpression = lambda as Expression<Func<T, bool>>;
4

2 に答える 2

0

コードの問題は、式のパラメーターが名前ではなく参照によって比較されることです。あなたのケースでこれを解決する最も簡単な方法は、独自の式を作成する代わりに、元の式のパラメーターを使用することです。

ParameterExpression param = expression.Parameters.Single();
var lambda = Expression.Lambda<Func<T, bool>>(
    Expression.GreaterThanOrEqual(expression.Body, Expression.Constant(date)),
    param);
于 2013-08-22T13:22:16.697 に答える
0

私には問題なく動作しているように見えますが、どのようなエラーが発生しますか? コンパイル時間/ランタイム?

x.Date が機能するためには、コンパイラはコンパイル時に型 T を認識し、実際に Date プロパティが含まれている必要があることに注意してください。

私はこれを次のように実装しました:

internal interface ITClass
{
    DateTime Date { get; set; }
}

internal class TClass : ITClass
{
    public DateTime Date { get; set; }
}

と ...

private static void CompareDate<T>() where T : ITClass
{
    Expression<Func<T, DateTime>> expression = x => x.Date;

    var date = new DateTime(2013, 8, 22);

    var param = Expression.Parameter(typeof(T), "x");
    Expression lambda = Expression.Lambda<Func<T, bool>>(
    Expression.GreaterThanOrEqual(expression.Body,
    Expression.Constant(date, typeof(DateTime))), param);

    var valueExpression = lambda as Expression<Func<T, bool>>;            
}
于 2013-08-22T12:10:21.173 に答える