public AutoConfigAttribute(AutoConfigFlags flags = AutoConfigFlags.None, params object[] acceptableValues)
 {
     if (acceptableValues.Length > 0)
     {
         var avList = (flags & AutoConfigFlags.AVIsList) == AutoConfigFlags.AVIsList;
         if (!avList && acceptableValues.Length != 2)
         {
             throw new ArgumentException("Range mode for acceptableValues (flag AVIsList not set) requires either 0 or 2 params; received " + acceptableValues.Length + ".\nThe description provided was: \"" + desc + "\".");
         }
         var iType = acceptableValues[0].GetType();
         for (var i = 1; i < acceptableValues.Length; i++)
         {
             if (iType != acceptableValues[i].GetType())
             {
                 throw new ArgumentException("Types of all acceptableValues must match");
             }
         }
         var avbVariety = avList ? typeof(AcceptableValueList <>).MakeGenericType(iType) : typeof(AcceptableValueRange <>).MakeGenericType(iType);
         this.avb     = (AcceptableValueBase)Activator.CreateInstance(avbVariety, acceptableValues);
         this.avbType = iType;
     }
     this.flags = flags;
 }
 public AutoConfigAttribute(string desc, AutoConfigFlags flags = AutoConfigFlags.None, params object[] acceptableValues) : this(flags, acceptableValues)
 {
     this.desc = desc;
 }
 public AutoConfigAttribute(string name, string desc, AutoConfigFlags flags = AutoConfigFlags.None, params object[] acceptableValues) : this(desc, flags, acceptableValues)
 {
     this.name = name;
 }