我正在尝试构建一种从一种类型映射到另一种类型的方法,因为我知道它们将(应该)具有相同的结构。相关问题 https://stackoverflow.com/questions/2622003/call-webservice-without-adding-a-webreference-with-complex-types.
为了简化繁琐的工作,我使用 Codeplex 的 AutoMapper,具有以下功能:
private static List<Type> seenTypes = new List<Type>();
private static void MapDataObjects(Type a, Type b)
{
AutoMapper.Mapper.CreateMap(a, b);
PropertyInfo[] aProps = a.GetProperties();
PropertyInfo[] bProps = b.GetProperties();
foreach (PropertyInfo aProp in aProps)
{
if (aProp.PropertyType.Namespace.StartsWith("System")
|| seenTypes.Contains(aProp.PropertyType))
continue;
foreach (PropertyInfo bProp in bProps)
{
if (aProp.Name == bProp.Name)
{
MapDataObjects(aProp.PropertyType, bProp.PropertyType);
seenTypes.Add(aProp.PropertyType);
break;
}
}
}
}
单步执行代码时似乎工作正常,但是调用我的 Map 函数会出现以下错误:
AutoMapper.AutoMapperMappingException:
Trying to map TDXDataTypes.ClientActivity[] to ClientActivity[].
Using mapping configuration for TDXDataTypes.ClientActivity[] to ClientActivity[]
Destination property: Activities
Exception of type 'AutoMapper.AutoMapperMappingException' was thrown.
---> System.ArgumentException:
Type 'ClientActivity[]' does not have a default constructor
找到了解决方案(在提出问题之前应该更努力地尝试):
if (aProp.Name == bProp.Name)
{
if (aProp.PropertyType.IsArray)
{
MapDataObjects(aProp.PropertyType.GetElementType(), bProp.PropertyType.GetElementType());
seenTypes.Add(aProp.PropertyType.GetElementType());
break;
}
else
{
MapDataObjects(aProp.PropertyType, bProp.PropertyType);
seenTypes.Add(aProp.PropertyType);
break;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)