Example #1
0
        private static BidirectionalDictionary <string, string> InitializeEnumType(Type type)
        {
            BidirectionalDictionary <string, string> map = new BidirectionalDictionary <string, string>(
                StringComparer.OrdinalIgnoreCase,
                StringComparer.OrdinalIgnoreCase);

            foreach (FieldInfo f in type.GetFields())
            {
                string n1 = f.Name;
                string n2;

#if !NET20
                n2 = f.GetCustomAttributes(typeof(EnumMemberAttribute), true)
                     .Cast <EnumMemberAttribute>()
                     .Select(a => a.Value)
                     .SingleOrDefault() ?? f.Name;
#else
                n2 = f.Name;
#endif

                string s;
                if (map.TryGetBySecond(n2, out s))
                {
                    throw new InvalidOperationException("Enum name '{0}' already exists on enum '{1}'.".FormatWith(CultureInfo.InvariantCulture, n2, type.Name));
                }

                map.Set(n1, n2);
            }

            return(map);
        }
Example #2
0
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            Type type = (ReflectionUtils.IsNullableType(objectType) ? Nullable.GetUnderlyingType(objectType) : objectType);

            if (reader.TokenType == JsonToken.Null)
            {
                if (!ReflectionUtils.IsNullableType(objectType))
                {
                    throw new Exception("Cannot convert null value to {0}.".FormatWith(CultureInfo.InvariantCulture, objectType));
                }
                return(null);
            }
            if (reader.TokenType == JsonToken.String)
            {
                BidirectionalDictionary <string, string> enumNameMap = GetEnumNameMap(type);
                enumNameMap.TryGetBySecond(reader.Value.ToString(), out var first);
                first = first ?? reader.Value.ToString();
                return(Enum.Parse(type, first, ignoreCase: true));
            }
            if (reader.TokenType == JsonToken.Integer)
            {
                return(ConvertUtils.ConvertOrCast(reader.Value, CultureInfo.InvariantCulture, type));
            }
            throw new Exception("Unexpected token when parsing enum. Expected String or Integer, got {0}.".FormatWith(CultureInfo.InvariantCulture, reader.TokenType));
        }
Example #3
0
        public BidirectionalDictionary <string, string> InitializeEnumType(Type type)
        {
            BidirectionalDictionary <string, string> map = XStandardCollections.Api.BidirectionalDictionaries.New <string, string>(StringComparer.Ordinal, StringComparer.Ordinal);

            foreach (FieldInfo f in type.GetFields(BindingFlags.Public | BindingFlags.Static))
            {
                string n1 = f.Name;
                string n2;

#if HAVE_DATA_CONTRACTS
                n2 = f.GetCustomAttributes(typeof(EnumMemberAttribute), true)
                     .Cast <EnumMemberAttribute>()
                     .Select(a => a.Value)
                     .SingleOrDefault() ?? f.Name;
#else
                n2 = f.Name;
#endif

                string s;
                if (map.TryGetBySecond(n2, out s))
                {
                    throw new InvalidOperationException("Enum name '{0}' already exists on enum '{1}'.".FormatWith(CultureInfo.InvariantCulture, n2, type.Name));
                }

                map.Set(n1, n2);
            }

            return(map);
        }
Example #4
0
        private BidirectionalDictionary <string, string> GetEnumNameMap(Type t)
        {
            BidirectionalDictionary <string, string> bidirectionalDictionary;

            if (!this._enumMemberNamesPerType.TryGetValue(t, out bidirectionalDictionary))
            {
                lock (this._enumMemberNamesPerType)
                {
                    if (this._enumMemberNamesPerType.TryGetValue(t, out bidirectionalDictionary))
                    {
                        return(bidirectionalDictionary);
                    }
                    bidirectionalDictionary = new BidirectionalDictionary <string, string>(StringComparer.OrdinalIgnoreCase, StringComparer.OrdinalIgnoreCase);
                    FieldInfo[] fields = t.GetFields();
                    for (int i = 0; i < fields.Length; i++)
                    {
                        FieldInfo fieldInfo = fields[i];
                        string    name      = fieldInfo.Name;
                        string    text      = (from EnumMemberAttribute a in fieldInfo.GetCustomAttributes(typeof(EnumMemberAttribute), true)
                                               select a.Value).SingleOrDefault <string>() ?? fieldInfo.Name;
                        string text2;
                        if (bidirectionalDictionary.TryGetBySecond(text, out text2))
                        {
                            throw new InvalidOperationException("Enum name '{0}' already exists on enum '{1}'.".FormatWith(CultureInfo.InvariantCulture, text, t.Name));
                        }
                        bidirectionalDictionary.Set(name, text);
                    }
                    this._enumMemberNamesPerType[t] = bidirectionalDictionary;
                }
                return(bidirectionalDictionary);
            }
            return(bidirectionalDictionary);
        }
Example #5
0
        private BidirectionalDictionary <string, string> GetEnumNameMap(Type t)
        {
            BidirectionalDictionary <string, string> bidirectionalDictionary;

            if (!this._enumMemberNamesPerType.TryGetValue(t, out bidirectionalDictionary))
            {
                lock (this._enumMemberNamesPerType)
                {
                    if (this._enumMemberNamesPerType.TryGetValue(t, out bidirectionalDictionary))
                    {
                        return(bidirectionalDictionary);
                    }
                    bidirectionalDictionary = new BidirectionalDictionary <string, string>((IEqualityComparer <string>)StringComparer.OrdinalIgnoreCase, (IEqualityComparer <string>)StringComparer.OrdinalIgnoreCase);
                    foreach (FieldInfo item_0 in t.GetFields())
                    {
                        string local_2 = item_0.Name;
                        string local_3 = item_0.Name;
                        string local_4;
                        if (bidirectionalDictionary.TryGetBySecond(local_3, out local_4))
                        {
                            throw new InvalidOperationException(StringUtils.FormatWith("Enum name '{0}' already exists on enum '{1}'.", (IFormatProvider)CultureInfo.InvariantCulture, (object)local_3, (object)t.Name));
                        }
                        bidirectionalDictionary.Set(local_2, local_3);
                    }
                    this._enumMemberNamesPerType[t] = bidirectionalDictionary;
                }
            }
            return(bidirectionalDictionary);
        }
Example #6
0
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            string str;
            Type   type = (!ReflectionUtils.IsNullableType(objectType) ? objectType : Nullable.GetUnderlyingType(objectType));

            if (reader.TokenType == JsonToken.Null)
            {
                if (!ReflectionUtils.IsNullableType(objectType))
                {
                    throw new Exception("Cannot convert null value to {0}.".FormatWith(CultureInfo.InvariantCulture, new object[] { objectType }));
                }
                return(null);
            }
            if (reader.TokenType != JsonToken.String)
            {
                if (reader.TokenType != JsonToken.Integer)
                {
                    throw new Exception("Unexpected token when parsing enum. Expected String or Integer, got {0}.".FormatWith(CultureInfo.InvariantCulture, new object[] { reader.TokenType }));
                }
                return(ConvertUtils.ConvertOrCast(reader.Value, CultureInfo.InvariantCulture, type));
            }
            BidirectionalDictionary <string, string> enumNameMap = this.GetEnumNameMap(type);

            enumNameMap.TryGetBySecond(reader.Value.ToString(), out str);
            str = str ?? reader.Value.ToString();
            return(Enum.Parse(type, str, true));
        }
Example #7
0
 private BidirectionalDictionary <string, string> GetEnumNameMap(Type t)
 {
     if (!_enumMemberNamesPerType.TryGetValue(t, out BidirectionalDictionary <string, string> value))
     {
         lock (_enumMemberNamesPerType)
         {
             if (_enumMemberNamesPerType.TryGetValue(t, out value))
             {
                 return(value);
             }
             value = new BidirectionalDictionary <string, string>(StringComparer.OrdinalIgnoreCase, StringComparer.OrdinalIgnoreCase);
             FieldInfo[] fields = t.GetFields();
             foreach (FieldInfo fieldInfo in fields)
             {
                 string name = fieldInfo.Name;
                 string text = (from EnumMemberAttribute a in fieldInfo.GetCustomAttributes(typeof(EnumMemberAttribute), inherit: true)
                                select a.Value).SingleOrDefault() ?? fieldInfo.Name;
                 if (value.TryGetBySecond(text, out string _))
                 {
                     throw new Exception("Enum name '{0}' already exists on enum '{1}'.".FormatWith(CultureInfo.InvariantCulture, text, t.Name));
                 }
                 value.Add(name, text);
             }
             _enumMemberNamesPerType[t] = value;
             return(value);
         }
     }
     return(value);
 }
Example #8
0
        private static string ResolvedEnumName(BidirectionalDictionary <string, string> map, string enumText)
        {
            string text;

            map.TryGetBySecond(enumText, out text);
            text = (text ?? enumText);
            return(text);
        }
Example #9
0
        private static string ResolvedEnumName(BidirectionalDictionary <string, string> map, string enumText)
        {
            string resolvedEnumName;

            map.TryGetBySecond(enumText, out resolvedEnumName);
            resolvedEnumName = resolvedEnumName ?? enumText;
            return(resolvedEnumName);
        }
Example #10
0
        private bool TryResolvedEnumName(BidirectionalDictionary <string, string> map, string enumText, out string resolvedEnumName)
        {
            if (map.TryGetBySecond(enumText, out resolvedEnumName))
            {
                return(true);
            }

            resolvedEnumName = null;
            return(false);
        }
Example #11
0
        public string GetReference(object context, object value)
        {
            BidirectionalDictionary <string, object> mappings = this.GetMappings(context);

            if (!mappings.TryGetBySecond(value, out string str))
            {
                this._referenceCount++;
                str = this._referenceCount.ToString(CultureInfo.InvariantCulture);
                mappings.Set(str, value);
            }
            return(str);
        }
        public string GetReference(object context, object value)
        {
            BidirectionalDictionary <string, object> mappings = GetMappings(context);

            if (!mappings.TryGetBySecond(value, out var first))
            {
                _referenceCount++;
                first = _referenceCount.ToString(CultureInfo.InvariantCulture);
                mappings.Add(first, value);
            }
            return(first);
        }
        public string GetReference(object context, object value)
        {
            BidirectionalDictionary <string, object> mappings = this.GetMappings(context);
            string first;

            if (!mappings.TryGetBySecond(value, out first))
            {
                ++this._referenceCount;
                first = this._referenceCount.ToString((IFormatProvider)CultureInfo.InvariantCulture);
                mappings.Set(first, value);
            }
            return(first);
        }
Example #14
0
        public string GetReference(object context, object value)
        {
            BidirectionalDictionary <string, object> mappings = this.GetMappings(context);
            string text;

            if (!mappings.TryGetBySecond(value, out text))
            {
                this._referenceCount++;
                text = this._referenceCount.ToString(CultureInfo.get_InvariantCulture());
                mappings.Add(text, value);
            }
            return(text);
        }
        public string GetReference(object context, object value)
        {
            BidirectionalDictionary <string, object> mappings = GetMappings(context);

            string reference;

            if (!mappings.TryGetBySecond(value, out reference))
            {
                _referenceCount++;
                reference = _referenceCount.ToString(CultureInfo.InvariantCulture);
                mappings.Set(reference, value);
            }

            return(reference);
        }
Example #16
0
        /// <summary>
        /// A cached representation of the Enum string representation to respect per Enum field name.
        /// </summary>
        /// <param name="t">The type of the Enum.</param>
        /// <returns>A map of enum field name to either the field name, or the configured enum member name (<see cref="EnumMemberAttribute"/>).</returns>
        private BidirectionalDictionary <string, string> GetEnumNameMap(Type t)
        {
            BidirectionalDictionary <string, string> map;

            if (!_enumMemberNamesPerType.TryGetValue(t, out map))
            {
                lock (_enumMemberNamesPerType)
                {
                    if (_enumMemberNamesPerType.TryGetValue(t, out map))
                    {
                        return(map);
                    }

                    map = new BidirectionalDictionary <string, string>(
                        StringComparer.OrdinalIgnoreCase,
                        StringComparer.OrdinalIgnoreCase);

                    foreach (FieldInfo f in t.GetFields())
                    {
                        string n1 = f.Name;
                        string n2;

#if !NET20
                        n2 = f.GetCustomAttributes(typeof(EnumMemberAttribute), true)
                             .Cast <EnumMemberAttribute>()
                             .Select(a => a.Value)
                             .SingleOrDefault() ?? f.Name;
#else
                        n2 = f.Name;
#endif

                        string s;
                        if (map.TryGetBySecond(n2, out s))
                        {
                            throw new Exception("Enum name '{0}' already exists on enum '{1}'."
                                                .FormatWith(CultureInfo.InvariantCulture, n2, t.Name));
                        }

                        map.Add(n1, n2);
                    }

                    _enumMemberNamesPerType[t] = map;
                }
            }

            return(map);
        }
Example #17
0
        private BidirectionalDictionary <string, string> GetEnumNameMap(Type t)
        {
            BidirectionalDictionary <string, string> bidirectionalDictionary;
            BidirectionalDictionary <string, string> bidirectionalDictionary1;
            string str;

            if (!this._enumMemberNamesPerType.TryGetValue(t, out bidirectionalDictionary))
            {
                object obj = this._enumMemberNamesPerType;
                Monitor.Enter(obj);
                try
                {
                    if (!this._enumMemberNamesPerType.TryGetValue(t, out bidirectionalDictionary))
                    {
                        bidirectionalDictionary = new BidirectionalDictionary <string, string>(StringComparer.OrdinalIgnoreCase, StringComparer.OrdinalIgnoreCase);
                        FieldInfo[] fields = t.GetFields();
                        for (int i = 0; i < (int)fields.Length; i++)
                        {
                            FieldInfo fieldInfo = fields[i];
                            string    name      = fieldInfo.Name;
                            string    str1      = (
                                from EnumMemberAttribute a in fieldInfo.GetCustomAttributes(typeof(EnumMemberAttribute), true)
                                select a.Value).SingleOrDefault <string>() ?? fieldInfo.Name;
                            if (bidirectionalDictionary.TryGetBySecond(str1, out str))
                            {
                                throw new Exception("Enum name '{0}' already exists on enum '{1}'.".FormatWith(CultureInfo.InvariantCulture, new object[] { str1, t.Name }));
                            }
                            bidirectionalDictionary.Add(name, str1);
                        }
                        this._enumMemberNamesPerType[t] = bidirectionalDictionary;
                        return(bidirectionalDictionary);
                    }
                    else
                    {
                        bidirectionalDictionary1 = bidirectionalDictionary;
                    }
                }
                finally
                {
                    Monitor.Exit(obj);
                }
                return(bidirectionalDictionary1);
            }
            return(bidirectionalDictionary);
        }
        /// <summary>
        /// A cached representation of the Enum string representation to respect per Enum field name.
        /// </summary>
        /// <param name="t">The type of the Enum.</param>
        /// <returns>A map of enum field name to either the field name, or the configured enum member name (<see cref="EnumMemberAttribute"/>).</returns>
        private BidirectionalDictionary <string, string> GetEnumNameMap(Type t)
        {
            BidirectionalDictionary <string, string> map;

            if (!_enumMemberNamesPerType.TryGetValue(t, out map))
            {
                lock (_enumMemberNamesPerType)
                {
                    if (_enumMemberNamesPerType.TryGetValue(t, out map))
                    {
                        return(map);
                    }

                    map = new BidirectionalDictionary <string, string>(
                        StringComparer.OrdinalIgnoreCase,
                        StringComparer.OrdinalIgnoreCase);

                    foreach (FieldInfo f in t.GetFields())
                    {
                        string n1 = f.Name;
                        string n2;

                        n2 = f.Name;

                        string s;
                        if (map.TryGetBySecond(n2, out s))
                        {
                            throw new Exception("Enum name '{0}' already exists on enum '{1}'."
                                                .FormatWith(CultureInfo.InvariantCulture, n2, t.Name));
                        }

                        map.Add(n1, n2);
                    }

                    _enumMemberNamesPerType[t] = map;
                }
            }

            return(map);
        }
        private BidirectionalDictionary <string, string> GetEnumNameMap(Type t)
        {
            BidirectionalDictionary <string, string> bidirectionalDictionary;

            if (!this._enumMemberNamesPerType.TryGetValue(t, ref bidirectionalDictionary))
            {
                Dictionary <Type, BidirectionalDictionary <string, string> > enumMemberNamesPerType = this._enumMemberNamesPerType;
                lock (enumMemberNamesPerType)
                {
                    if (this._enumMemberNamesPerType.TryGetValue(t, ref bidirectionalDictionary))
                    {
                        return(bidirectionalDictionary);
                    }
                    bidirectionalDictionary = new BidirectionalDictionary <string, string>(StringComparer.get_OrdinalIgnoreCase(), StringComparer.get_OrdinalIgnoreCase());
                    FieldInfo[] fields = t.GetFields();
                    for (int i = 0; i < fields.Length; i++)
                    {
                        FieldInfo fieldInfo = fields[i];
                        string    name      = fieldInfo.get_Name();
                        string    text      = Enumerable.SingleOrDefault <string>(Enumerable.Select <EnumMemberAttribute, string>(Enumerable.Cast <EnumMemberAttribute>(fieldInfo.GetCustomAttributes(typeof(EnumMemberAttribute), true)), (EnumMemberAttribute a) => a.Value)) ?? fieldInfo.get_Name();
                        string    text2;
                        if (bidirectionalDictionary.TryGetBySecond(text, out text2))
                        {
                            throw new Exception("Enum name '{0}' already exists on enum '{1}'.".FormatWith(CultureInfo.get_InvariantCulture(), new object[]
                            {
                                text,
                                t.get_Name()
                            }));
                        }
                        bidirectionalDictionary.Add(name, text);
                    }
                    this._enumMemberNamesPerType.set_Item(t, bidirectionalDictionary);
                }
                return(bidirectionalDictionary);
            }
            return(bidirectionalDictionary);
        }
        private BidirectionalDictionary <string, string> GetEnumNameMap(Type t)
        {
            BidirectionalDictionary <string, string> bidirectionalDictionary;

            if (!this._enumMemberNamesPerType.TryGetValue(t, out bidirectionalDictionary))
            {
                object enumMemberNamesPerType = this._enumMemberNamesPerType;
                lock (enumMemberNamesPerType)
                {
                    if (this._enumMemberNamesPerType.TryGetValue(t, out bidirectionalDictionary))
                    {
                        return(bidirectionalDictionary);
                    }
                    bidirectionalDictionary = new BidirectionalDictionary <string, string>(StringComparer.OrdinalIgnoreCase, StringComparer.OrdinalIgnoreCase);
                    foreach (FieldInfo fieldInfo in t.GetFields())
                    {
                        string name = fieldInfo.Name;
                        string text = (from EnumMemberAttribute a in fieldInfo.GetCustomAttributes(typeof(EnumMemberAttribute), true)
                                       select a.Value).SingleOrDefault <string>() ?? fieldInfo.Name;
                        string text2;
                        if (bidirectionalDictionary.TryGetBySecond(text, out text2))
                        {
                            throw new Exception("Enum name '{0}' already exists on enum '{1}'.".FormatWith(CultureInfo.InvariantCulture, new object[]
                            {
                                text,
                                t.Name
                            }));
                        }
                        bidirectionalDictionary.Add(name, text);
                    }
                    this._enumMemberNamesPerType[t] = bidirectionalDictionary;
                }
                return(bidirectionalDictionary);
            }
            return(bidirectionalDictionary);
        }
Example #21
0
    /// <summary>
    /// A cached representation of the Enum string representation to respect per Enum field name.
    /// </summary>
    /// <param name="t">The type of the Enum.</param>
    /// <returns>A map of enum field name to either the field name, or the configured enum member name (<see cref="EnumMemberAttribute"/>).</returns>
    private BidirectionalDictionary<string, string> GetEnumNameMap(Type t)
    {
      BidirectionalDictionary<string, string> map;

      if (!_enumMemberNamesPerType.TryGetValue(t, out map))
      {
        lock (_enumMemberNamesPerType)
        {
          if (_enumMemberNamesPerType.TryGetValue(t, out map))
            return map;

          map = new BidirectionalDictionary<string, string>(
            StringComparer.OrdinalIgnoreCase,
            StringComparer.OrdinalIgnoreCase);

          foreach (FieldInfo f in t.GetFields())
          {
            string n1 = f.Name;
            string n2;
            
#if !NET20
            n2 = f.GetCustomAttributes(typeof (EnumMemberAttribute), true)
                          .Cast<EnumMemberAttribute>()
                          .Select(a => a.Value)
                          .SingleOrDefault() ?? f.Name;
#else
            n2 = f.Name;
#endif

            string s;
            if (map.TryGetBySecond(n2, out s))
            {
              throw new InvalidOperationException("Enum name '{0}' already exists on enum '{1}'."
                .FormatWith(CultureInfo.InvariantCulture, n2, t.Name));
            }

            map.Set(n1, n2);
          }

          _enumMemberNamesPerType[t] = map;
        }
      }

      return map;
    }
		private static string ResolvedEnumName(BidirectionalDictionary<string, string> map, string enumText)
		{
			string resolvedEnumName;
			map.TryGetBySecond(enumText, out resolvedEnumName);
			resolvedEnumName = resolvedEnumName ?? enumText;
			return resolvedEnumName;
		}
Example #23
0
 private BidirectionalDictionary<string, string> GetEnumNameMap(Type t)
 {
   BidirectionalDictionary<string, string> bidirectionalDictionary;
   if (!this._enumMemberNamesPerType.TryGetValue(t, out bidirectionalDictionary))
   {
     lock (this._enumMemberNamesPerType)
     {
       if (this._enumMemberNamesPerType.TryGetValue(t, out bidirectionalDictionary))
         return bidirectionalDictionary;
       bidirectionalDictionary = new BidirectionalDictionary<string, string>((IEqualityComparer<string>) StringComparer.OrdinalIgnoreCase, (IEqualityComparer<string>) StringComparer.OrdinalIgnoreCase);
       foreach (FieldInfo item_0 in t.GetFields())
       {
         string local_2 = item_0.Name;
         string local_3 = item_0.Name;
         string local_4;
         if (bidirectionalDictionary.TryGetBySecond(local_3, out local_4))
           throw new InvalidOperationException(StringUtils.FormatWith("Enum name '{0}' already exists on enum '{1}'.", (IFormatProvider) CultureInfo.InvariantCulture, (object) local_3, (object) t.Name));
         bidirectionalDictionary.Set(local_2, local_3);
       }
       this._enumMemberNamesPerType[t] = bidirectionalDictionary;
     }
   }
   return bidirectionalDictionary;
 }
        private static BidirectionalDictionary<string, string> InitializeEnumType(Type type)
        {
            BidirectionalDictionary<string, string> map = new BidirectionalDictionary<string, string>(
                StringComparer.OrdinalIgnoreCase,
                StringComparer.OrdinalIgnoreCase);

            foreach (FieldInfo f in type.GetFields())
            {
                string n1 = f.Name;
                string n2;

#if !NET20
                n2 = f.GetCustomAttributes(typeof(EnumMemberAttribute), true)
                    .Cast<EnumMemberAttribute>()
                    .Select(a => a.Value)
                    .SingleOrDefault() ?? f.Name;
#else
                n2 = f.Name;
#endif

                string s;
                if (map.TryGetBySecond(n2, out s))
                    throw new InvalidOperationException("Enum name '{0}' already exists on enum '{1}'.".FormatWith(CultureInfo.InvariantCulture, n2, type.Name));

                map.Set(n1, n2);
            }

            return map;
        }