Source/Config/MemoryProperty.cs

using MG;
using MG.Attributes;
using Microsoft.SqlServer.Management.Smo;
using System;
using System.Reflection;
 
namespace SQL.SMO.Config
{
    public enum MeasurementUnit : long
    {
        [MGName("Bytes")]
        Bytes = 1L
        ,
        [MGName("Kilobytes")]
        KB = 1024L
        ,
        [MGName("Megabytes")]
        MB = 1048576L
        ,
        [MGName("Gigabytes")]
        GB = 1073741824L
    }
    public class MemoryProperty : MGNameResolver
    {
        // Fields
        private MeasurementUnit _u;
        private long _min;
        private long _max;
        public long? MinimumMemory => _min / (long)_u;
        public long? MaximumMemory => _max / (long)_u;
        public string InUnitsOf => GetName(_u);
 
        public MemoryProperty(ConfigProperty minMemory, ConfigProperty maxMemory, MeasurementUnit inUnits)
        {
            _min = minMemory.RunValue * (long)MeasurementUnit.MB;
            _max = maxMemory.RunValue * (long)MeasurementUnit.MB;
            _u = inUnits;
        }
 
        public MemoryProperty(long? min, long? max, MeasurementUnit inUnits)
        {
            if (min.HasValue)
            {
                _min = min.Value * (long)inUnits;
            }
            if (max.HasValue)
            {
                _max = max.Value * (long)inUnits;
            }
            _u = inUnits;
        }
 
        public override string ToString() =>
            Convert.ToString(_min / (long)MeasurementUnit.MB) + ", " + Convert.ToString(_max / (long)MeasurementUnit.MB);
 
        internal object ToString(MemType type, MeasurementUnit inUnits)
        {
            switch (type)
            {
                case MemType.Min:
                    return _min / (long)inUnits;
                case MemType.Max:
                    return _max / (long)inUnits;
                default:
                    return null;
            }
        }
 
 
        public string[] ToString(MeasurementUnit inUnits)
        {
            string[] outStr = new string[2];
            if (inUnits == MeasurementUnit.Bytes)
            {
                outStr[0] = Convert.ToString(_min);
                outStr[1] = Convert.ToString(_max);
            }
            else
            {
                outStr[0] = Convert.ToString(_min / (long)inUnits);
                outStr[1] = Convert.ToString(_max / (long)inUnits);
            }
            return outStr;
        }
 
        public MemoryProperty ChangeUnitsTo(MeasurementUnit inUnits)
        {
            _u = inUnits;
            return this;
        }
 
        internal enum MemType : int
        {
            Min = 0,
            Max = 1
        }
    }
}