Beispiel #1
0
        /// <summary>
        /// Tries to parse enum.
        /// </summary>
        /// <param name="val">The val.</param>
        /// <param name="type">The type.</param>
        /// <returns>System.Object.</returns>
        public static object TryParseEnum(this string val, Type type)
        {
            long curItem, result = _enumError;

            try
            {
                val = (val ?? string.Empty).Trim();
                if (!val.IsNullOrEmpty())
                {
                    var valNames     = val.Split(_enumSep, StringSplitOptions.RemoveEmptyEntries);
                    var enumTypeName = type.FullName + "/";
                    result = 0;

                    _lock.SetLockState(RWLock.State.ReadLock);
                    if (!_enumMap.ContainsKey(enumTypeName))
                    {
                        var names  = Enum.GetNames(type);
                        var values = (IList)Enum.GetValues(type);
                        _lock.SetLockState(RWLock.State.WriteLock);
                        for (var loop = 0; loop < names.Length; ++loop)
                        {
                            curItem = Convert.ToInt64(values[loop]);
                            _enumMap[enumTypeName + names[loop]] = curItem;
                            _enumMap[enumTypeName + curItem]     = curItem;
                        }
                        _enumMap[enumTypeName] = 0;
                    }
                    for (var loop = 0; result != _enumError && loop < valNames.Length; ++loop)
                    {
                        result = _enumMap.TryGetValue(enumTypeName + valNames[loop], out curItem)
                                                        ? result | curItem
                                                        : _enumError;
                    }
                }
            }
            catch
            {
                result = _enumError;
            }
            finally
            {
                _lock.SetLockState(RWLock.State.NoLock);
            }
            return(result == _enumError ? null : Enum.ToObject(type, result));
        }
        /// <summary> Create and use a ReaderWriterLock in write mode while delegate executes </summary>
        /// <typeparam name="T">  </typeparam>
        /// <param name="rwLock"> The rw lock. </param>
        /// <param name="timeOut"> The time out. </param>
        /// <param name="safeCall"> The safe call. </param>
        /// <returns> T. </returns>
        public static T UseWriteLock <T>(this ReaderWriterLock rwLock, int?timeOut, Func <T> safeCall)
        {
            if (rwLock.IsWriterLockHeld)
            {
                return(safeCall());
            }

            var oldState = rwLock.SetLockState(RWLock.State.WriteLock, null, timeOut);

            try
            {
                return(safeCall());
            }
            finally
            {
                rwLock.SetLockState(oldState);
            }
        }