|
using Application.Core.Specification.Contract;
using Application.Core.Specification.Implementation;
using System;
using System.Linq;
using System.Linq.Expressions;
namespace Application.Core.Specification
{
/// <summary>
/// A logic Not Specification
/// </summary>
/// <typeparam name="T">Type of entity that check this specification</typeparam>
public sealed class NotSpecification<T> : Specification<T> where T : class
{
#region Members
Expression<Func<T, bool>> _OriginalCriteria;
#endregion
#region Constructor
/// <summary>
/// Constructor for NotSpecificaiton
/// </summary>
/// <param name="originalSpecification">Original specification</param>
public NotSpecification(ISpecification<T> originalSpecification)
{
if (originalSpecification == (ISpecification<T>)null)
throw new ArgumentNullException("originalSpecification");
_OriginalCriteria = originalSpecification.SatisfiedBy();
}
/// <summary>
/// Constructor for NotSpecification
/// </summary>
/// <param name="originalSpecification">Original specificaiton</param>
public NotSpecification(Expression<Func<T, bool>> originalSpecification)
{
if (originalSpecification == (Expression<Func<T, bool>>)null)
throw new ArgumentNullException("originalSpecification");
_OriginalCriteria = originalSpecification;
}
#endregion
#region Override Specification methods
/// <summary>
/// Implementation for method SatidfiedBy
/// </summary>
/// <returns></returns>
public override Expression<Func<T, bool>> SatisfiedBy()
{
return Expression.Lambda<Func<T, bool>>(Expression.Not(_OriginalCriteria.Body),
_OriginalCriteria.Parameters.Single());
}
#endregion
}
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.