Преобразование объекта класса в другой
У меня есть два класса, которые почти равны, за исключением тех типов данных, которые хранятся в них. Один класс содержит все двойные значения, в то время как другие содержат все значения float.
class DoubleClass
{
double X;
double Y;
double Z;
}
class FloatClass
{
float X;
float Y;
float Z;
}
Теперь у меня есть точка DoubleClass, которую я хочу преобразовать в FloatClass.
var doubleObject = new DoubleClass();
var convertedObject = (FloatClass)doubleObject; // TODO: This
Один простой способ - создать метод, который создает новый объект FloatClass, заполняет все значения и возвращает их. Есть ли другой эффективный способ сделать это.
Ответы
Ответ 1
Используйте оператор преобразования:
public static explicit operator FloatClass (DoubleClass c) {
FloatCass fc = new FloatClass();
fc.X = (float) c.X;
fc.Y = (float) c.Y;
fc.Z = (float) c.Z;
return fc;
}
А потом просто используйте его:
var convertedObject = (FloatClass) doubleObject;
Edit
Я изменил оператор на explicit
вместо implicit
, так как я использовал приведение FloatClass
в примере. Я предпочитаю использовать explicit
над implicit
, поэтому он заставляет меня подтвердить, к какому типу будет преобразован объект (для меня это означает меньше ошибок отвлечения и удобочитаемости).
Однако вы можете использовать преобразование implicit
, и тогда вам просто нужно будет сделать:
var convertedObject = doubleObject;
Ссылка
Ответ 2
Для достижения этой цели вы можете использовать Операторы конверсии.
Пример:
struct FloatClass
{
public FloatClass(DoubleClass dClass) {
//conversion...
}
...
public static explicit operator FloatClass(DoubleClass dClass)
{
FloatClassd = new FloatClass(dClass); // explicit conversion
return d;
}
}
var convertedObject = (FloatClass)doubleObject;
Ответ 3
Похоже, вы могли бы использовать generics здесь:
public class GenericClass<T>
{
T X { get; set; }
T Y { get; set; }
T Z { get; set; }
}
GenericClass<float> floatClass = new GenericClass<float>();
GenericClass<double> doubleClass = new GenericClass<double>();
Ответ 4
Вы можете добавить неявный оператор преобразования типов:
public class DoubleClass
{
public double X;
public double Y;
public double Z;
public static implicit operator FloatClass(DoubleClass d)
{
return new FloatClass { X = (float)d.X, Y = (float)d.Y, Z = (float)d.Z };
}
}
Теперь это работает:
DoubleClass doubleObject = new DoubleClass();
FloatClass convertedObject = doubleObject;
Ответ 5
Самый простой способ сделать это - использовать сериализатор. Используйте сериализатор Newtonsoft JSON, который работает лучше всего.
с использованием Newtonsoft.Json;
private void Convert()
{
DoubleClass doubleClass = new DoubleClass {X = 123.123, Y = 321.321, Z = 111.111};
var serializedoubleClass = JsonConvert.SerializeObject(doubleClass);
var floatClass = JsonConvert.DeserializeObject(serializedoubleClass, typeof(FloatClass));
}
Ответ 6
Лучший способ - Сериализовать объект и снова опреснять его