- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
private static readonly ConcurrentDictionary<Expression, object> CachedFunctions;
public static Func<TEntity, bool> AsFunc<TEntity>(this object entity, Expression<Func<TEntity, bool>> expr)
where TEntity : class, IEntity
{
//@see http://sergeyteplyakov.blogspot.ru/2015/06/lazy-trick-with-concurrentdictionary.html
return (Func<TEntity, bool>)CachedFunctions.GetOrAdd(expr, id => new Lazy<object>(
() => CachedFunctions.GetOrAdd(id, expr.Compile())));
}
Вот так хорошая идея ломается о кривую реализацию. Вместо того чтобы сохранить в кэш требуемый тип, сохраняем туда Lazy, возвращающий себя же :)