我想知道是否有人可以推荐一个可以在 .NET2.0 中工作的 Automapper 的替代品。
我有一个 dll 描述了一个相当复杂的结构。dll 位于 web 服务的两端,但是当通过 web 服务检索数据时,命名空间会阻止对象的直接映射,因此我不得不求助于编码映射类。
我合并了 Automapper,它完全符合我的要求,但它不适用于 .NET2.0。我需要使用 .NET2.0,因为有数百台远程机器将运行客户端软件,并且它们仅限于 .NET2.0。
任何帮助,将不胜感激。
我想知道是否有人可以推荐一个可以在 .NET2.0 中工作的 Automapper 的替代品。
我有一个 dll 描述了一个相当复杂的结构。dll 位于 web 服务的两端,但是当通过 web 服务检索数据时,命名空间会阻止对象的直接映射,因此我不得不求助于编码映射类。
我合并了 Automapper,它完全符合我的要求,但它不适用于 .NET2.0。我需要使用 .NET2.0,因为有数百台远程机器将运行客户端软件,并且它们仅限于 .NET2.0。
任何帮助,将不胜感激。
由于这是 2.0,我猜这是一个常规的基于 wsdl 的 Web 服务,通过(与默认XmlSerializer
使用的 WCF 不同)工作。DataContractSerializer
如果是这种情况,您应该可以使用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。
根据结构复杂性,您可以使用反射来获取第一个对象的属性列表,并将关联值设置为具有相同名称的第二个对象属性。
如果你的结构只有简单的属性,它会很有效。
在这种情况下,反射是你最好的朋友。
下面是属性复制器的粗略实现。您只需要新建一个目标类型的实例并将其与设置了所有属性值的源实例一起传递给它。
编辑:正如 Marc 所指出的,这只会在琐碎的属性映射方面起到作用。带上一粒盐。
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;
}
}
}
}
}
}
}