арифметические операции с object
От: Radamsa  
Дата: 08.01.11 20:35
Оценка:
Доброе время суток.

Возникла необходимость выполнять арифметические операции для объектов с разными типами.
Загвоздка в том, что программе эти переменные видны как object, хотя и известен их тип (класс Type).
Подскажите, как можно такое провернуть.

Далее идет код, который должен немного пояснить задачу.

    /// <summary>
    /// Идентификаторы типов
    /// </summary>
    public enum DTIdentifier
    {
        Int,
        Float,
        Text,
    }

    public struct DTInfo
    {
        public string Name;
        public DTIdentifier DataTypeId;
        public int Length;
        public Type DotNetType;

        public DTInfo(string name, DTIdentifier dtid, int length, Type dotnetType)
        {
            Name = name;
            DataTypeId = dtid;
            Length = length;
            DotNetType = dotnetType;
        }
    }

    class DataType
    {
        public DTInfo TypeInfo { get; private set; }

        private static readonly DTInfo[] AllTypes = new DTInfo[] {
            new DTInfo("int",    DTIdentifier.Int,    4,      typeof(int)),
            new DTInfo("float",    DTIdentifier.Float,    8,      typeof(double)),
            new DTInfo("text",    DTIdentifier.Text,    1000,   typeof(string)),
        };

        // Введено для упрощения кода в данном примере.
        public static readonly DataType _TypeInt = new DataType(AllTypes[0]);
        public static readonly DataType _TypeFloat = new DataType(AllTypes[1]);
        public static readonly DataType _TypeString = new DataType(AllTypes[2]);

        public DataType(DTInfo info)
        {
            TypeInfo = info;
        }
    }

    class DataValue
    {
        public DataType DataType { get; private set; }
        public int ActualLength { get; private set; }

        private object m_value;
        public object Value
        {
            get { return m_value; }
            set
            {
                // Проверим соответствие типов и если необходимо, то выполним преобразование
                if (DataType.TypeInfo.DotNetType != value.GetType())
                    value = Convert.ChangeType(value, DataType.TypeInfo.DotNetType);

                // Выполним дополнительные проверки, связанные с параметрами данных
                switch (DataType.TypeInfo.DataTypeId)
                {
                    case DTIdentifier.Text:
                        // Для строковых данных проверим размер строки
                        PropertyInfo pinfo = DataType.TypeInfo.DotNetType.GetProperty("Length");
                        int len = (int)pinfo.GetValue(value, null);
                        if (len > ActualLength)
                            throw new Exception("Too long");
                        break;
                }

                m_value = value;
            }
        }

        public DataValue(DataType dataType)
        {
            DataType = dataType;
            ActualLength = DataType.TypeInfo.Length;
        }

        public DataValue(DataType dataType, int length)
        {
            DataType = dataType;
            ActualLength = length;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            DataValue i = new DataValue(DataType._TypeInt) { Value = 10 };
            DataValue f = new DataValue(DataType._TypeFloat) { Value = 1.1 };
            DataValue s = new DataValue(DataType._TypeString) { Value = "string value" };
            DataValue s100 = new DataValue(DataType._TypeString, 100) { Value = "short string" };

            // Требуется вот это:
            //DataValue r = i + f;
        }
    }


Требуется написать для класса DataValue операторы арифметических действий,
чтобы добиться работоспособности выражения DataValue r = i + f;
Но при этом нет особого желания делать проверки типов вручную.

Заранее спасибо. Если вдруг я вдруг неправильным путем решаю задачу, наставьте на путь истинный, пожалуйста.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.