gpt4 book ai didi

c# - AutoMapper 对象集合不映射

转载 作者:太空宇宙 更新时间:2023-11-03 16:33:58 25 4
gpt4 key购买 nike

我正在尝试映射一个与我要映射到的类具有相同布局的类。一切顺利,除非我尝试映射对象集合。例如,当我尝试映射源类中定义的这个属性时:

[System.Xml.Serialization.XmlElementAttribute("trust", typeof(Trust))]
[System.Xml.Serialization.XmlElementAttribute("valuation", typeof(Valuation))]
[System.Xml.Serialization.XmlElementAttribute("waiver_of_premium_ind", typeof(YesNo))]
[System.Xml.Serialization.XmlElementAttribute("written_under_trust_ind", typeof(YesNo), IsNullable = true)]
[System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemsElementName")]
public object[] Items
{
get { return this.itemsField; }
set { this.itemsField = value; }
}

我发现它不映射但保留在与源对象相同的命名空间中,即使它是目标对象中的集合也是如此。

不知道你对这件事有什么想法吗?

编辑:通过示例获取更多信息 - 源类:

namespace Namespace1
{
public class Person
{
public int PersonID { get; set; }
public List<Arm> Arms { get; set; }

[System.Xml.Serialization.XmlElementAttribute("_arms", typeof(Arm))]
[System.Xml.Serialization.XmlElementAttribute("_hand", typeof(Hand))]
public object[] Items { get; set; }
}

public class Arm
{
public Hand Hand { get; set; }
}

public class Hand
{
public int HandID { get; set; }
public string HandSide { get; set; }
public List<Fingers> Fingers { get; set; }
}

public class Fingers
{
public int FingerNumber { get; set; }
}
}

目标类:

namespace Namespace2
{
public class Person
{
public int PersonID { get; set; }
public List<Arm> Arms { get; set; }

[System.Xml.Serialization.XmlElementAttribute("_arms", typeof(Arm))]
[System.Xml.Serialization.XmlElementAttribute("_hand", typeof(Hand))]
public object[] Items { get; set; }
}

public class Arm
{
public Hand Hand { get; set; }
}

public class Hand
{
public int HandID { get; set; }
public string HandSide { get; set; }
public List<Fingers> Fingers { get; set; }
}

public class Fingers
{
public int FingerNumber { get; set; }
}
}

映射两个类型和两个命名空间内的所有嵌套类型的代码:

public static void CreateMappings(string nsFrom, string nsTo, Type typeFrom)
{
Assembly assembly = Assembly.GetAssembly(typeFrom);
var TypesInNamespace = assembly.GetTypes().Where(type => type.Namespace == nsFrom);
foreach (var sourceType in TypesInNamespace)
{
Type destinationType = Type.GetType(sourceType.FullName.Replace(nsFrom, nsTo));
Mapper.CreateMap(sourceType, destinationType);
}
}

然后我从 Namespace1 创建我的 person 对象并使用上面的函数创建映射,如下所示:

CreateMappings("Namespace1", "Namespace2", typeof(Namespace1.Person));

之后我像这样调用 map 函数:

var result = Mapper.Map<Namespace2.Person>(person);

这映射了 Person 类的所有属性,除了 Items 对象数组。它传输对象,但它们仍然属于 Namespace1 而不是 Namespace2 命名空间。

可以从监 window 口找到问题的图像here

如果您愿意,可以下载控制台应用程序here

感谢您提供的任何帮助。中号

最佳答案

我知道这真的很旧,但我确实找到了答案(至少对于最新版本的 AutoMapper(在回答这个问题时是 8.0)。您需要为 Person 编写自定义 ITypeConverter做对象[]的映射。

在我的例子中,我有一个这样的对象(删除了 xml 属性):

namespace bob {
public class sally
{
public bob.MyEnum[] SomeVarName {get;set;}
public object[] SomeValueVar {get;set;}
}
}

namespace martin {
public class sally
{
public martin.MyEnum[] SomeVarName {get;set;}
public object[] SomeValueVar {get;set;}
}
}

自定义类型转换器如下所示:

public class LocationTypeResolver : ITypeConverter<bob.sally,martin.sally>
{
public martin.sally Convert(bob.sally source, martin.sally destination, ResolutionContext context)
{
var retVal = new martin.sally
{
SomeValueVar = new object[source.SomeVarName.Length],
SomeVarName = new martin.MyEnum[source.SomeVarName.Length]
};

for (int i = 0; i < source.Items.Length; i++)
{
retVal.SomeVarName[i] = (martin.MyEnum)Enum.Parse(typeof(martin.MyEnum), source.SomeVarName[i].ToString());

switch (source.ItemsElementName[i])
{
//map any custom types
default:
retVal.SomeValueVar[i] = source.SomeValueVar[i]
}
}

return retVal;
}
}

关于c# - AutoMapper 对象集合不映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9823088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com