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

时间:2013-09-13 10:38:07

标签: c# .net type-conversion

除了存储在其中的数据类型之外,我有两个几乎相等的类。一个类包含所有double值,而other包含所有浮点值。

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对象的方法,填充所有值并返回它。还有其他有效的方法吗?

8 个答案:

答案 0 :(得分:20)

使用转换运算符:

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;

Reference

答案 1 :(得分:3)

您可以使用Conversion Operators 来实现此目的。

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;

答案 2 :(得分:3)

听起来你可以在这里使用泛型:

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

答案 3 :(得分:2)

您可以添加implicit type conversion operator

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;

答案 4 :(得分:1)

为这些扩展方法添加一个类:

declare @searchText nvarchar(50) = 'fname@example.com'

select * 
from Discussion 
where
    Comments = @searchText
    or (
        CHARINDEX(@searchText, Comments) > 0
        and SUBSTRING(Comments, CHARINDEX(@searchText, Comments) - 1, 1) in (' ', '<', '>', '"', '''', ',', ';', '=', '(', ')', '*') 
        and SUBSTRING(Comments, CHARINDEX(@searchText, Comments) + LEN(@searchText), 1) in (' ', '<', '>', '"', '''', ',', ';', '=', '(', ')', '*'))

使用:

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

答案 5 :(得分:0)

最佳转换方式

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

答案 6 :(得分:-1)

最简单的方法是使用序列化程序。使用最有效的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));
    }

答案 7 :(得分:-3)

最好的方法是Serialize对象并再次将其淡化