Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对象映射到位图_C#_Bitmap_Mapping - Fatal编程技术网

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属性。是的,我想我会这样做。现在实现一个遵循策略模式的映射机制。这样,我就可以在策略库中查找任何映射。而且我可以很容易地扩展它。