C# 对象映射到位图
我正在编写一个简单的映射器类,用于在不同/相同类型的不同对象之间克隆和复制属性 映射是通过反射来执行的,对于值类型、列表和引用类型来说效果很好 一切都适用于以下类型:C# 对象映射到位图,c#,bitmap,mapping,C#,Bitmap,Mapping,我正在编写一个简单的映射器类,用于在不同/相同类型的不同对象之间克隆和复制属性 映射是通过反射来执行的,对于值类型、列表和引用类型来说效果很好 一切都适用于以下类型: class SimpleValueTypes { public string Name { get; set; } public int Number { get; set; } public long LongNumber { get; set; } public float FloatNumb
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; }
}
其中,另一个类型是类类型。引用类型的映射是通过递归检查属性来执行的,直到所有属性都以如下方式映射到目标:
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;}
}
对于这种情况,你建议怎么办?显然,复制属性不会产生原始位图对象的新副本
PS
我不能使用automapper/emit mapper或任何其他外部软件包。如果您正在实现一个映射程序,而不使用一些现有的映射程序: 我认为这对你来说总是有效的,这只是你项目的一个例子(这是一个好消息)。问题是,在我看来,您已经到达了需要实现自定义映射器的位置。因此,使用映射基本功能定义一些基类,如
BaseMapper
,并从中派生出bitmapper:BaseMapper
类,它负责映射Bitmap
类型的对象
一段时间后,您可能会得到一些其他类型,您将创建带有映射具体实现的MyTypeMapper:BaseMapper
这只是一个基本的想法,您应该考虑这一点,以找到最适合您的项目的具体实施方式
如果您不必使用自己的映射器,您可以使用市场上现有的一些解决方案,例如
关于。如果对象是可克隆的,您可以利用它,您可以轻松检查它是否是可克隆的,并依赖于实现。对于不可克隆的对象,可能会帮助您
Gert Jan为什么你不能使用例如Automapper?这是这个项目的一个策略,就像iClonable方法一样(图像实现了它并且肯定会工作),而且你提到的线程肯定会有很大的帮助。我并不热衷于依靠iClonable解决可能隐藏的问题(克隆/深度克隆等)+不管怎样,这也是我所倾向的。无法在这一个上使用外部库。您可以使用运行重写的具体映射器实现的唯一抽象SetMap属性。是的,我想我会这样做。现在实现一个遵循策略模式的映射机制。这样,我就可以在策略库中查找任何映射。而且我可以很容易地扩展它。