2012-03-22 7 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; } 
} 
} 

先クラス:2つの名前空間内の2種類と、すべてのネストされた型をマップするために

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); 
    } 
} 

次に、Namespから自分のpersonオブジェクトを作成します。そのように、上記の機能を使用してマッピングをACE1し、作成します。その後

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

を、私はそうのようなmap関数を呼び出します。

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

これが以外のPersonクラスのすべてのプロパティがうまくマッピングしますItemsオブジェクトの配列。これはオブジェクト全体を転送しますが、Namespace2名前空間の代わりにNamespace1に属します。ウォッチウィンドウから問題の

イメージ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

こんにちは、これを見ていただきありがとうございます。主な違いは、2つのタイプが異なる名前空間に属するということです。だから私が見つけたのは、オブジェクトコレクションが関わっているとき(そして、そのときだけ)、オブジェクトオブジェクトのネームスペースにマッピングしていないということです。私は[link](http://109.228.27.61/Test/objectcollectionmappings.zip)に簡単な例をまとめました。これはうまくいけばこれを説明します - それは2つの別々のクラス定義を持つコンソールアプリケーションです。これは、2つのオブジェクト内のさまざまな型をマッピングしていることを示しています。私は動的にそうしています。それ以上のお手伝いをありがとうございます。 M – Michael

+0

上記の問題の最新の説明をご覧ください。何か助けてくれてありがとう。 M – Michael

関連する問題