2011-09-09 174 views
0

我正在写一个简单的映射器类来克隆和复制不同对象之间的不同/相同类型的属性。对象映射到位图

映射是通过反射执行的,对于值类型,列表和引用类型来说工作得很好。

一切工作的类型像这样的:

class SimpleValueTypes 
{ 
    public string Name { get; set; } 
    public int Number { get; set; } 
    public long LongNumber { get; set; } 
    public float FloatNumber { get; set; } 
    public bool BooleanValue { get; set; } 
    public AnotherType AnotherProperty{ get; set; } 

}

其中AnotherType是一个类类型。引用类型的映射,直到所有的属性被映射到目的地几乎这种方式通过检查属性递归地执行:

object value = mapFrom.GetValue(input, null);     
mapTo.SetValue(output, value, null); 

其中mapForm和mapTo是的PropertyInfo对象。

问题开始时,带有“位图”属性的新类型到达,我意识到整个类的对象不能用同样的方式处理。

Class NewType 
{ 
    public Bitmap Bitmap{get;set;} 
    public string Name{get;set;} 
} 

对于像这样的情况,你会推荐做什么?显然,复制属性不会导致原始Bitmap对象的新副本。

PS

我不能使用automapper /发射映射器或任何其他外部包。

+0

为什么你不能使用Automapper? – Tigran

+0

这是这个项目的政策 – mhttk

回答

1

如果要实现一个映射器,而不是使用一些现有的:

我认为这永远在您身边工作,这只是你的项目(这是一个好消息)的情况。问题是,就我而言,你到达了需要实现自定义映射器的地步。因此,使用映射基本功能定义一些基类,如BaseMapper,并从中派生出BitmapMapper:BaseMapper类,该类负责处理Bitmap类型对象的映射。

经过一段时间可能会得到一些其他类型,您将创建MyTypeMapper : BaseMapper与具体的映射实施。

这只是一个基本的想法,你应该想到这个找出最合适的方式具体的它为你的项目执行。

如果使用自己的映射不是强制的,你可以使用一些现有的解决方案,可在市场上,例如像Automapper

问候。

+0

这也是我所倾向的。不能在这一个上使用外部库。 – mhttk

+0

您可以使用运行重写的具体映射器实现的独特抽象SetMap属性。 – Tigran

+0

是的,我想我是这个。现在实施一种遵循战略模式的映射机制。这样我就可以在策略存储库中查找任何映射。我也可以很容易地扩展它。 – mhttk

1

如果对象是ICLoneable,您可以利用它,您可以轻松检查它是否是依赖于实现。对于不是ICloneable的对象this thread可能会帮助你。

Gert-Jan

+0

我喜欢ICloneable的方法(图片实现它,肯定会工作),绝对你提到的线程是非常有帮助的。我不想依赖ICloneable解决可能隐藏的问题(克隆/深度克隆等)。无论如何 – mhttk