C# 将一个类的对象转换为另一个类的对象

C# 将一个类的对象转换为另一个类的对象,c#,.net,type-conversion,C#,.net,Type Conversion,我有两个类,除了其中存储的数据类型外,它们几乎相等。一个类包含所有双精度值,而另一个类包含所有浮点值 class DoubleClass { double X; double Y; double Z; } class FloatClass { float X; float Y; float Z; } 现在我有一个DoubleClass的点,我想把它转换成FloatClass var doubleObject = new DoubleClass(

我有两个类,除了其中存储的数据类型外,它们几乎相等。一个类包含所有双精度值,而另一个类包含所有浮点值

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对象,填充所有值并返回它的方法。有没有其他有效的方法可以做到这一点。

您可以使用来实现这一点

例如:

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>();
公共类GenericClass
{
tx{get;set;}
T{get;set;}
tz{get;set;}
}
GenericClass floatClass=新的GenericClass();
GenericClass doubleClass=新的GenericClass();

使用转换运算符:

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;
编辑

public static class Extention {
     public static string ConvertObjectToJson(this object ob)
     {
         return JsonConvert.SerializeObject(ob);
     }
}
我将运算符改为
显式
,而不是
隐式
,因为我在示例中使用了
FloatClass
强制转换。我更喜欢使用
显式
而不是
隐式
,因此它迫使我确认对象将转换为什么类型(对我来说,这意味着更少的分心错误+可读性)

但是,您可以使用
隐式
转换,然后只需执行以下操作:

var convertedObject = doubleObject;

您可以添加:

现在,这项工作:

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

转换的最佳方式

public static class Extention {
     public static string ConvertObjectToJson(this object ob)
     {
         return JsonConvert.SerializeObject(ob);
     }
}
用于使用

var doubleClass = new DoubleClass {
   x = 10,
   y = 20
};
var floatClass = JsonConvert.DeserializeObject<FloatClass>(doubleClass.ConvertObjectToJson());
var doubleClass=新的doubleClass{
x=10,
y=20
};
var floatClass=JsonConvert.DeserializeObject(doubleClass.ConvertObjectToJson());

为ase扩展方法添加一个类:

public static class ExtensionMethods
{
    public static T ToObject<T>(this Object fromObject)
    {
        return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(fromObject));
    }


    public static List<T> ToObjectList<T>(this Object fromObject)
    {
        return JsonConvert.DeserializeObject<List<T>>(JsonConvert.SerializeObject(fromObject));
    }
}
公共静态类扩展方法
{
公共静态T对象(此对象来自对象)
{
返回JsonConvert.DeserializeObject(JsonConvert.SerializeObject(fromObject));
}
公共静态列表到对象列表(此对象来自对象)
{
返回JsonConvert.DeserializeObject(JsonConvert.SerializeObject(fromObject));
}
}
使用:

使用yourExtensionMethodNamespace;
Class2 obj2=obj1.ToObject();
List lst2=_db.Blogs.ToList().ToObjectList();

是否允许更改FloatClass和/或DoubleClass的源代码?@I4V Conversion!=CloningIt可以是一个解决方案,但是代码在很多地方都被使用,所以这个解决方案需要很多努力,CTRL+F->“FloatClass”->V(Expand)->“GenericClass”->替换全部。完成:)您需要将double转换为float以避免编译错误。@MatthewWatson-yap。好眼力。谢谢,我想将DoubleClass的2D数组转换为FloatClass,可以使用LINQ吗?或者我必须在这里使用for循环?@FaisalHafeez您可以尝试:
FloatClass[]converted=Array.ConvertAll(Array,s=>(FloatClass)s)
用于简单数组或查看2D数组的此实现:@LetiAgalves:如果有隐式强制转换,甚至可以省略强制转换操作符:
FloatClass fc=doubleObject现在我想将DoubleClass的2D数组转换为FloatClass,是否可以使用LINQ?或者我必须在这里使用for循环?现在我想将DoubleClass的2D数组转换为FloatClass,是否可以使用LINQ?或者我必须在这里使用for循环?@FaisalHafeez:例如,您可以为您的数组类添加一个。反序列化将失败,因为这些结构的存储机制不同。即使它们是,而且它能起作用,但这样做仍然会非常昂贵,而且是一种相当糟糕的做法。当然,因为当你转换它时,可能会非常咸,这就是为什么你需要在之后对它进行脱盐,jk
using YourExtentionMethodNamespace;

Class2 obj2 = obj1.ToObject<Class2>();
List<Class2> lst2 = _db.Blogs.ToList().ToObjectList<Class2>();