Преобразование объекта класса в другой

У меня есть два класса, которые почти равны, за исключением тех типов данных, которые хранятся в них. Один класс содержит все двойные значения, в то время как другие содержат все значения 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

Лучший способ - Сериализовать объект и снова опреснять его