web-dev-qa-db-ja.com

クラスのオブジェクトを別のオブジェクトに変換する

格納されているデータ型を除いて、ほぼ等しい2つのクラスがあります。 1つのクラスにはすべてのdouble値が含まれ、他のクラスにはすべてのfloat値が含まれます。

class DoubleClass
{
    double X;
    double Y;
    double Z;
}

class FloatClass
{
    float X;
    float Y;
    float Z;
}

これで、FloatClassに変換するDoubleClassのポイントができました。

var doubleObject = new DoubleClass();

var convertedObject = (FloatClass)doubleObject; // TODO: This

1つの簡単な方法は、新しいFloatClassオブジェクトを作成し、すべての値を入力して返すメソッドを作成することです。これを行う他の効率的な方法はありますか。

14
fhnaseer

変換演算子を使用します:

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;

参照

21
letiagoalves

ここでジェネリックを使用できるように聞こえます:

 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
Darren

Conversion Operators を使用してこれを実現できます。

例えば:

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
Tigran

暗黙の型変換演算子 を追加できます。

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;
2
Tim Schmelter