格納されているデータ型を除いて、ほぼ等しい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オブジェクトを作成し、すべての値を入力して返すメソッドを作成することです。これを行う他の効率的な方法はありますか。
変換演算子を使用します:
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;
ここでジェネリックを使用できるように聞こえます:
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>();
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;
暗黙の型変換演算子 を追加できます。
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;