Доброе время суток.
Возникла необходимость выполнять арифметические операции для объектов с разными типами.
Загвоздка в том, что программе эти переменные видны как 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;
Но при этом нет особого желания делать проверки типов вручную.
Заранее спасибо. Если вдруг я вдруг неправильным путем решаю задачу, наставьте на путь истинный, пожалуйста.