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