private void VerifyNotEquals(MemberExpressionCacheKey key1, MemberExpressionCacheKey key2) { var hashCode1 = Comparer.GetHashCode(key1); var hashCode2 = Comparer.GetHashCode(key2); Assert.NotEqual(hashCode1, hashCode2); Assert.NotEqual(key1, key2, Comparer); var cachedKey1 = key1.MakeCacheable(); Assert.NotEqual(key2, cachedKey1, Comparer); var cachedKeyHashCode1 = Comparer.GetHashCode(cachedKey1); Assert.NotEqual(cachedKeyHashCode1, hashCode2); }
private static Func <TModel, object> CompileForChainedMemberAccess( Expression <Func <TModel, TResult> > expression, MemberExpression memberExpression) { // Input: () => m.Member1.Member2 // Output: () => (m == null || m.Member1 == null) ? null : m.Member1.Member2 var key = new MemberExpressionCacheKey(typeof(TModel), memberExpression); if (_chainedMemberAccessCache.TryGetValue(key, out var result)) { return(result); } var cacheableKey = key.MakeCacheable(); result = _chainedMemberAccessCache.GetOrAdd(cacheableKey, Rewrite(expression, memberExpression)); return(result); }