2012-03-22 2 views
2

Я пытаюсь отобразить класс, который имеет идентичный макет для класса, к которому я пытаюсь перейти. Все идет хорошо, за исключением случаев, когда я пытаюсь сопоставить коллекции объектов. Например, когда я пытаюсь отобразить это свойство, определенное в классе Источник:Коллекции объектов AutoMapper, которые не отображаются

[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 из Namesp ACE1 и создать отображения с помощью функции выше, как так:

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

После этого я вызываю функцию карты следующим образом:

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

Это отображает все свойства класса Person просто отлично за исключением Элемент массива объектов. Он передает объекты, но они все еще принадлежат к Namespace1 вместо пространства имен Namespace2.

Изображение проблемы из окна часов можно найти here

Вы можете загрузить приложение консоли, если вам нравится here

Спасибо за любую помощь вы можете дать. M

ответ

0

Я пробовал следующее и, похоже, работает;

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; } 
} 
+0

Я проверил и сообщит вам. – daryal

+0

Привет, спасибо, что посмотрели на это. Я думаю, что ключевое различие состоит в том, что два типа относятся к разным пространствам имен. Таким образом, я обнаружил, что они не сопоставляются по отношению к пространству имен объектов назначения, когда (и только когда) участвует коллекция объектов. Я собрал простой пример в [link] (http://109.228.27.61/Test/objectcollectionmappings.zip), который, надеюсь, проиллюстрирует это - это консольное приложение с двумя отдельными определениями классов. Он показывает, что я сопоставляю различные типы внутри двух объектов, и я делаю это динамически. Спасибо за любую дальнейшую помощь, которую вы можете дать. M – Michael

+0

См. Мое обновленное объяснение проблемы выше. Еще раз спасибо за любую помощь. M – Michael

Смежные вопросы