/// <summary>Unregisters all kind of alias (Extension Methods, Names, Static Members, Types and Values).</summary>
        /// <returns>An Fluent EvalContext.</returns>
        public EvalContext UnregisterAll()
        {
            AliasExtensionMethods.Clear();
            AliasGlobalConstants.Clear();
            AliasGlobalVariables.Clear();
            AliasNames.Clear();
            AliasStaticMembers.Clear();
            AliasTypes.Clear();

            return(this);
        }
        /// <summary>Unregisters static member from specified types.</summary>
        /// <param name="members">A variable-length parameters list containing members.</param>
        /// <returns>An Fluent EvalContext.</returns>
        public EvalContext UnregisterStaticMember(params MemberInfo[] members)
        {
            foreach (var member in members)
            {
                ConcurrentDictionary<MemberInfo, byte> values;
                if (AliasStaticMembers.TryGetValue(member.Name, out values))
                {
                    byte outByte;
                    values.TryRemove(member, out outByte);
                }
            }

            return this;
        }
        /// <summary>Registers specified static members.</summary>
        /// <param name="members">A variable-length parameters list containing members to register.</param>
        /// <returns>An Fluent EvalContext.</returns>
        public EvalContext RegisterStaticMember(params MemberInfo[] members)
        {
            foreach (var member in members)
            {
                AliasStaticMembers.AddOrUpdate(member.Name, s =>
                {
                    var dict = new ConcurrentDictionary <MemberInfo, byte>();
                    dict.TryAdd(member, 1);
                    return(dict);
                }, (s, list) =>
                {
                    list.TryAdd(member, 1);
                    return(list);
                });
            }

            return(this);
        }
 /// <summary>Makes a shallow copy of current EvalContext.</summary>
 /// <returns>A shallow copy of the current EvalContext.</returns>
 public EvalContext Clone()
 {
     return(new EvalContext
     {
         AliasExtensionMethods = new ConcurrentDictionary <string, ConcurrentDictionary <MethodInfo, byte> >(AliasExtensionMethods.Select(pair => new KeyValuePair <string, ConcurrentDictionary <MethodInfo, byte> >(pair.Key, new ConcurrentDictionary <MethodInfo, byte>(pair.Value)))),
         AliasGlobalConstants = new ConcurrentDictionary <string, ConstantExpression>(AliasGlobalConstants),
         AliasGlobalVariables = new ConcurrentDictionary <string, object>(AliasGlobalVariables),
         AliasMembers = new ConcurrentDictionary <string, ConcurrentDictionary <MemberInfo, byte> >(AliasMembers.Select(pair => new KeyValuePair <string, ConcurrentDictionary <MemberInfo, byte> >(pair.Key, new ConcurrentDictionary <MemberInfo, byte>(pair.Value)))),
         AliasNames = new ConcurrentDictionary <string, string>(AliasNames),
         AliasStaticMembers = new ConcurrentDictionary <string, ConcurrentDictionary <MemberInfo, byte> >(AliasStaticMembers.Select(pair => new KeyValuePair <string, ConcurrentDictionary <MemberInfo, byte> >(pair.Key, new ConcurrentDictionary <MemberInfo, byte>(pair.Value)))),
         AliasTypes = new ConcurrentDictionary <string, Type>(AliasTypes),
         BindingFlags = BindingFlags,
         CacheKeyPrefix = CacheKeyPrefix,
         SafeMode = SafeMode,
         UseCache = UseCache,
         UseCaretForExponent = UseCaretForExponent
     });
 }