نمط المواصفات - إنشاء مواصفات مركبة باستخدام Lambdas (C#)

StackOverflow https://stackoverflow.com/questions/3530052

سؤال

إذا كان لدي مواصفات محددة كتعبير على النحو التالي:

public Expression<Func<Foo, bool>> IsSuperhuman = 
  x => x.CanFly && x.HasXRayVision;

وأريد تحديد مواصفات أخرى "Issuperheroine" مع المنطق "خارق وهي أنثى" ، كيف يمكنني إعادة استخدام المواصفات الحالية داخل المواصفات الجديدة؟

هل كانت مفيدة؟

المحلول

هل راجعت باني مسند في Linqkit؟ إنه يبني تعبيرات عن طريق السماح لك و / أو التعبيرات معًا.

نصائح أخرى

هذه طريقة للقيام بذلك:

Expression<Func<Foo, bool>> IsSuperhuman = x => x.CanFly && x.HasXRayVision;

Expression<Func<Foo, bool>> IsSuperheroine = AndAlso(IsSuperhuman, x => x.IsFemale);

...

public static Expression<Func<T, TResult>> AndAlso<T, TResult>(Expression<Func<T, TResult>> expr1, Expression<Func<T, TResult>> expr2)
{
    var arg = Expression.Parameter(typeof(T), expr1.Parameters[0].Name);
    var andExpr = Expression.AndAlso(
        ReplaceParameter(expr1.Body, expr1.Parameters[0], arg),
        ReplaceParameter(expr2.Body, expr2.Parameters[0], arg));
    return Expression.Lambda<Func<T, TResult>>(andExpr, arg);
}

public static Expression ReplaceParameter(Expression expr, ParameterExpression oldParam, ParameterExpression newParam)
{
    return new ReplaceParameterVisitor(oldParam, newParam).Visit(expr);
}

internal class ReplaceParameterVisitor : ExpressionVisitor
{
    private ParameterExpression _oldParam;
    private ParameterExpression _newParam;

    public ReplaceParameterVisitor(ParameterExpression oldParam, ParameterExpression newParam)
    {
        _oldParam = oldParam;
        _newParam = newParam;
    }

    protected override Expression VisitParameter(ParameterExpression node)
    {
        if (node == _oldParam)
            return _newParam;
        return node;
    }
}

ربما لا تكون أبسط طريقة للقيام بذلك ، لكنها تعمل ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top