繁体   English   中英

AutoMapper对象集合未映射

[英]AutoMapper Object Collections not mapping

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

[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命名空间。

从监视窗口问题的图片,可以发现这里

您可以在此处下载控制台应用程序

谢谢你提供的所有帮助。 中号

我知道这确实很老,但是我确实找到了答案(至少对于最新版本的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;
    }
}

我已经尝试了以下方法,但似乎可行;

public class Tester
{
    public void Test()
    {
        AutoMapper.Mapper.CreateMap<FirstObject, SecondObject>();


        FirstObject t = new FirstObject();
        t.Items = new object[] { new Item() { Id = 1 }, new Item() { Id = 2 } };

        SecondObject result = AutoMapper.Mapper.Map<SecondObject>(t);
    }
}



public class FirstObject
{
    public object[] Items { get; set; }

}

public class SecondObject
{
    public object[] Items { get; set; }
}

public class Item
{
    public int Id { get; set; }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM