예제 #1
0
 public Enumerator(ref MemberExpressionCacheKey key)
 {
     Current           = null;
     _members          = key.Members;
     _memberExpression = key.MemberExpression;
     _index            = -1;
 }
        private static IList <MemberInfo> GetMembers(MemberExpressionCacheKey key)
        {
            var members = new List <MemberInfo>();

            foreach (var member in key)
            {
                members.Add(member);
            }

            return(members);
        }
        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);
        }
예제 #4
0
            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);
            }