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

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

6 ответов


Используйте оператор преобразования:

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;

редактировать

Я изменил оператор на explicit вместо implicit так как я использовал FloatClass приведите пример. Я предпочитаю использовать explicit над implicit поэтому он заставляет меня подтвердить, какой тип объекта будет преобразован в (для меня это означает меньше ошибок отвлечения + читаемость).

, вы можете использовать implicit преобразование, а затем вам просто нужно будет сделать:
var convertedObject = doubleObject;

ссылка


можно использовать Операторы Преобразования для достижения этой цели.

FR пример:

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;

Похоже, вы можете использовать дженерики здесь:

 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>();

вы можете добавить неявный оператор преобразования типа:

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;

самый простой способ сделать это с помощью сериализатора. Используйте 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));
    }

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