【问题标题】:Converting object of a class to of another one将一个类的对象转换为另一个类的对象
【发布时间】:2013-09-18 00:30:05
【问题描述】:

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

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

【问题讨论】:

标签: c# .net type-conversion


【解决方案1】:

使用转换运算符:

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

【讨论】:

  • 您需要将双精度数转换为浮点数以避免编译错误。
  • @MatthewWatson 是的。好眼力。谢谢
  • 现在我想将 DoubleClass 的二维数组转换为 FloatClass,是否可以使用 LINQ?还是我必须在这里使用 for 循环?
  • @FaisalHafeez 您可以尝试:FloatClass[] converted = Array.ConvertAll(array, s => (FloatClass) s); 用于简单数组或查看此实现以用于 2D 数组:stackoverflow.com/a/6065947/1873446
  • @letiagoalves:如果您有隐式转换,您甚至可以省略转换运算符:FloatClass fc = doubleObject;
【解决方案2】:

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

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

【讨论】:

  • 可以是一个解决方案,但是很多地方都在使用代码,所以这个解决方案需要付出很多努力,
  • CTRL+F -> "FloatClass" -> V(扩展)-> "GenericClass" -> 全部替换。完成:)
【解决方案3】:

您可以使用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;

【讨论】:

  • 现在我想将 DoubleClass 的二维数组转换为 FloatClass,是否可以使用 LINQ?还是我必须在这里使用 for 循环?
  • @FaisalHafeez:例如,您可以为您的数组类添加一个ExtensionMethds
【解决方案4】:

您可以添加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;

【讨论】:

  • 现在我想将 DoubleClass 的二维数组转换为 FloatClass,是否可以使用 LINQ?还是我必须在这里使用 for 循环?
【解决方案5】:

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

【讨论】:

    【解决方案6】:

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

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

    使用:

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

    【讨论】:

      【解决方案7】:

      转换的最佳方式

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

      【讨论】:

        【解决方案8】:

        最好的方法是序列化对象并再次对其进行淡化

        【讨论】:

        • 反序列化将失败,因为这些结构的存储机制并不相同。即使它们是,并且它可以工作,这样做仍然会非常昂贵并且是一种相当糟糕的做法。
        • 当然可以,因为当你转换它时,可能会很咸,这就是为什么你需要在它之后脱盐,jk
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-15
        • 1970-01-01
        • 2021-08-14
        • 2021-10-30
        • 1970-01-01
        相关资源
        最近更新 更多