2013-01-04 168 views
1

我想知道是否有人可以推荐一种可以在.NET2.0中工作的Automapper替代方案。.Net 2.0中的对象映射对象

我有一个dll描述了一个相当复杂的结构。 dll位于webservice的两端,但是当通过webservice检索数据时,名称空间会阻止对象的直接映射,所以我不得不求助于编码映射类。

我整合了Automapper,它完全按照我的意思,但它不会与.NET2.0一起使用。我需要使用.NET2.0,因为有几百个远程机器可以运行客户端软件,并且它们仅限于.NET2.0。

任何帮助,将不胜感激。

+0

您可以移动到至少NET 3.0?使用WCF,你可以共享一个DataContract对象的公共DLL,允许你严格重用同一个对象。 –

+0

不能使用任何东西,但.NET2.0。可能需要使用Mono和.NET Compact(对于CE5.0),所以我试图让解决方案尽可能简单。 – Sparers

回答

1

由于这是2.0,我猜这是一个常规的基于wsdl的web服务,通​​过XmlSerializer(不同于默认使用DataContractSerializer的WCF)工作。如果是这样的话,你应该能够使用XmlSerializer两次:

FromType fromObj = ...; 
ToType toObj; 
using(var ms = new MemoryStream()) 
{ 
    new XmlSerializer(typeof(FromType)).Serialize(ms, fromObj); 
    ms.Position = 0; 
    toObj = (ToType) new XmlSerializer(typeof(ToType)).Deserialize(ms); 
} 

也许并不理想,但只要类型兼容它应该工作。

令人沮丧的是,WCF工具内置了对重用现有类型定义的支持,以避免这种重复。但显然,这是3.0。

+0

谢谢马克,试过这个,但是转换只是部分的,因为子结构没有正确映射。与源xml中的名称空间引用有关吗? – Sparers

0

根据结构的复杂程度,您可以使用获取第一个对象的属性列表,并将相关值设置为具有相同名称的第二个对象属性。

如果你的结构只有简单的属性,它将是高效的。

0

在这种情况下,反射是你最好的朋友。

下面是一个财产复印机的粗略实施。您只需要新建一个目标类型的实例,并将其传递给具有所有属性值设置的源实例。

编辑:正如马克已经指出的,这只会在琐碎的属性映射方面做伎俩。带上一粒盐吧。

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Reflection; 

namespace StackOverflow 
{ 
    public static class ReflectionHelper 
    { 
     public static void CopyPropertyValues(object source, object target) 
     { 
      if (source == null) throw new ArgumentNullException("source"); 
      if (target == null) throw new ArgumentNullException("target"); 

      var sourceType = source.GetType(); 
      var targetType = target.GetType(); 
      var sourceProperties = sourceType.GetProperties(); 

      foreach (var sourceProperty in sourceProperties) 
      { 
       if (sourceProperty.CanRead) 
       { 
        var targetProperties = targetType.GetProperties(); 

        foreach (var targetProperty in targetProperties) 
        { 
         if (targetProperty.Name == sourceProperty.Name && 
          targetProperty.PropertyType == sourceProperty.PropertyType) 
         { 
          if (targetProperty.CanWrite) 
          { 
           var value = sourceProperty.GetValue(source, null); 

           targetProperty.SetValue(target, value, null); 
          } 

          break; 
         } 
        } 
       } 
      } 
     } 
    } 
} 
+0

这只适用于简单的值。在最真实的情况,你可能有处理列表,数组,字典等等 - 你可能不得不重新映射子对象(其将在同一时间内可更换式),以及重新映射遗产。 –