从另一个对象创建对象

时间:2009-12-15 16:22:43

标签: c# oop

原谅这个愚蠢的新问题,但...... 我正在将数据从一个表移动到另一个表。目标表模式与源表相同,只是它有一些额外的列。 Linq to SQL生成表示每个表的类。如果我有源对象,如何从中创建目标对象? 例如,源对象具有属性A,B,C。目标对象具有A,B,C,X,Y。我想做点什么:

  Destination dest = new Destination(Source source, int x, int y)
  {
    this.X = x;
    this.Y = y;
    ...
    // somehow set all the destination properties to 
    // their corresponding source value
  }

除了明确设置每个属性之外,还有一种优雅的方法吗? 我可以以某种方式从Source继承目的地吗?那会有帮助吗?

3 个答案:

答案 0 :(得分:2)

为什么不能使用Reflection编写自己的自动转换?你可以按照

的方式做点什么
   class Program {
     static void Main(string[] args)
     {
       Source item1 = new Source(2, 3, 4);
       Destination item2 = new Destination(item1, ContinueCopy);

       Console.WriteLine(string.Format("X: {0}\n Y: {1}", item2.X, item2.Y));
       Console.ReadKey();
     }

     public static bool ContinueCopy(string name, Type type)
     {
        if (name == "X" && type == typeof(int)) return false;

        return true;
     }
  }

  public class Source {
     public Source() { }
     public Source(int x, int y, int z)
     {
       myX = x;
       myY = y;
       myZ = z;
     }
     private int myX;
     public int X
     {
       get { return myX; }
       set { myX = value; }
     }

     private int myY;
     public int Y
     {
       get { return myY; }
       set { myY = value; }
     }

     private int myZ;
     public int Z
     {
       get { return myZ; }
       set { myZ = value; }
     }
  }


  public class Destination {
     public delegate bool ContinueCopyCallback(string propertyName, Type propertyType);

     public Destination() : this(0,0) { }
     public Destination(int x, int y)
     {
        myX = x;
        myY = y;
     }
     public Destination(Source copy) : this(copy, null) { }
     public Destination(Source copy, ContinueCopyCallback callback)
     {
        foreach (PropertyInfo pi in copy.GetType().GetProperties())
        {
           PropertyInfo pi2 = this.GetType().GetProperty(pi.Name);
           if ((callback == null || (callback != null && callback(pi.Name, 
              pi.PropertyType))) && pi2 != null && pi2.GetType() == pi.GetType())
           {
              pi2.SetValue(this, pi.GetValue(copy, null), null);
           }
        }
     }

     private int myX;
     public int X
     {
        get { return myX; }
        set { myX = value; }
     }

     private int myY;
     public int Y
     {
        get { return myY; }
        set { myY = value; }
     }
 }

输出将使item2.X的值为2,而item2.Y的值为3.

您还可以提供回调功能,允许您自定义过滤您不希望自动复制的属性名称。您也可以将复制代码编写为Destination的一个浅复制构造函数,它接受Source作为参数。

这是一种轻量级方法,因为您的需求非常简单。

答案 1 :(得分:1)

如果类型不相关,MiscUtil有:

Destination dest = PropertyCopy<Destination>.CopyFrom(source);

然后手动设置:

dest.X = x;
dest.Y = y;

您也可以编写转换方法/运算符,但是您需要维护它(PropertyCopy是自动的)。


重申你的遗产点;我觉得这不合适;你可以对部分类做一些事情,但是如果你做的话它将不再适用于LINQ-to-SQL(它本身处理继承,并且不会喜欢你这样做)。 / p>

答案 2 :(得分:0)

您可以在传入源的对象中使用复制构造函数,并手动将其字段复制到目标。然而,这确实需要大量的手动编码。

您还可以使用AutoMapper之类的库自动为您执行此操作。您可以定义该源可以映射到目标(仅此而已),并根据项目名称为您工作。

或者,如果您纯粹只是在移动数据(我假设在数据库中),您是否可以使用纯SQL来执行此操作而无需任何代码?