原谅这个愚蠢的新问题,但...... 我正在将数据从一个表移动到另一个表。目标表模式与源表相同,只是它有一些额外的列。 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继承目的地吗?那会有帮助吗?
答案 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来执行此操作而无需任何代码?