【问题标题】:Object Mapping to a Bitmap对象映射到位图
【发布时间】:2011-09-09 21:49:42
【问题描述】:

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

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

一切都适用于像这样的类型:

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/emit mapper 或任何其他外部包。

【问题讨论】:

  • 为什么不能使用例如 Automapper?
  • 这是这个项目的政策

标签: c# bitmap mapping


【解决方案1】:

如果你正在实现一个映射器而不使用一些现有的映射器:

我认为这总是对您有用,这只是您项目的一个案例(这是一个好消息)。问题是,在我看来,您到达了需要实现自定义映射器的地方。所以定义一些基类,如BaseMapper 与映射基本功能,并从它派生BitmapMapper:BaseMapper 类,该类负责Bitmap 类型对象的映射。

一段时间后你可能会得到一些其他类型,你将创建 MyTypeMapper : BaseMapper 并具体实现映射。

这只是一个基本的想法,您应该考虑一下以找出最适合您的项目的具体实现方式。

如果您不需要使用自己的映射器,您可以使用市场上现有的一些解决方案,例如 Automapper

问候。

【讨论】:

  • 这也是我倾向于的。不能在这个上使用外部库。
  • 您可以使用运行覆盖的具体映射器实现的唯一抽象 SetMap 属性。
  • 是的,我想我对此很感兴趣。现在实现一个遵循策略模式的映射机制。这样,我将在策略存储库中查找任何映射。我也可以很容易地扩展它。
【解决方案2】:

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

格特-简

【讨论】:

  • 我喜欢 ICloneable 方法(Image 实现了它并且肯定会工作),并且您提到的线程肯定有很大帮助。我并不热衷于依赖 ICloneable 来解决可能隐藏的问题(克隆/深度克隆等)。无论如何都要 +1
猜你喜欢
  • 2019-05-27
  • 2019-09-19
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多