Я пытаюсь сопоставить класс, который имеет макет, идентичный классу, которому я пытаюсь сопоставить. Все идет хорошо, кроме случаев, когда я пытаюсь отобразить коллекции объектов. Например, когда я пытаюсь отобразить это свойство, определенное в исходном классе:
[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; }
}
Я считаю, что он не отображается, но остается в том же пространстве имен, что и исходный объект, даже если он является коллекцией в целевом объекте.
Интересно, есть ли у вас идеи по этому поводу?
EDIT:
Более подробная информация в качестве примера - исходный класс:
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);
}
}
Затем я создаю свой объект person из Namespace1 и создаю сопоставления, используя приведенную выше функцию, например:
CreateMappings("Namespace1", "Namespace2", typeof(Namespace1.Person));
После этого я вызываю функцию карты следующим образом:
var result = Mapper.Map<Namespace2.Person>(person);
Это отображает все свойства класса Person просто отлично, КРОМЕ для массива объектов Items. Он передает объекты через, но они по-прежнему принадлежат пространству имен1 вместо пространства имен2.
Изображение проблемы из окна часов можно найти здесь
Вы можете скачать консольное приложение, если вам нравится здесь
Спасибо за любую помощь, которую вы можете оказать.
M