2017-03-21 18 views
-1

したがって、プロパティの点で同じ2つのオブジェクト/タイプがあります。今私は、オブジェクト1をオブジェクト2に変換するためにひどい入れ子になったループを実行しようとしています。この変換を行う簡単な方法はありませんか?私はおそらく私はもう一方のオブジェクトを逆シリアル化することができたと思ったが、これと運がない...1つのカスタムオブジェクトから別のオブジェクトへの簡単な変換

私はこれをやっている方法を最適化の面で私を向いて任意のヘルプはすばらしいだろう。 ..またはおそらく、オブジェクトがこれのように再構築されなければならないという事実を回避することはありませんか?

int acctcount = addFetchAcctList.AddFetchAcct.Length; 
AddCreateAcctsReq.AddFetchAcctType[] addFetchAccts = new AddCreateAcctsReq.AddFetchAcctType[acctcount]; 
for (int i = 0; i < acctcount; i++) 
{ 
    AddCreateAcctsReq.AddFetchAcctType addFetchAcct = new AddCreateAcctsReq.AddFetchAcctType(); 
    addFetchAcct.FIId = addFetchAcctList.AddFetchAcct[i].FIId; 
    addFetchAcct.AcctNumber = addFetchAcctList.AddFetchAcct[i].AcctNumber; 


    AddCreateAcctsReq.FIAcctNameType[] fiAcctNames = new AddCreateAcctsReq.FIAcctNameType[1]; 

    AddCreateAcctsReq.FIAcctNameType fiAcctName = new AddCreateAcctsReq.FIAcctNameType(); 
    fiAcctName.ParamName = addFetchAcctList.AddFetchAcct[i].FIAcctName[0].ParamName; 
    fiAcctName.ParamVal = addFetchAcctList.AddFetchAcct[i].FIAcctName[0].ParamVal; 
    fiAcctNames[0] = fiAcctName; 
    addFetchAcct.FIAcctName = fiAcctNames; 


    int acctbalcount = addFetchAcctList.AddFetchAcct[i].AcctBal.Length; 
    AddCreateAcctsReq.AcctBalType[] acctBals = new AddCreateAcctsReq.AcctBalType[acctbalcount]; 
    for (int j = 0; j < acctbalcount; j++) 
    { 
     AddCreateAcctsReq.AcctBalType acctBal = new AddCreateAcctsReq.AcctBalType(); 
     acctBal.BalType = (AddCreateAcctsReq.BalType)addFetchAcctList.AddFetchAcct[i].AcctBal[j].BalType; 
     acctBal.CurAmt = new AddCreateAcctsReq.AmountType(); 
     acctBal.CurAmt.Amt = addFetchAcctList.AddFetchAcct[i].AcctBal[j].CurAmt.Amt; 
     acctBal.CurAmt.CurCode = (AddCreateAcctsReq.CurCodeType)addFetchAcctList.AddFetchAcct[i].AcctBal[j].CurAmt.CurCode; 

     acctBals[j] = acctBal; 
    } 
    addFetchAcct.AcctBal = acctBals; 

    addFetchAcct.CurCode = (AddCreateAcctsReq.CurCodeType)addFetchAcctList.AddFetchAcct[i].CurCode; 

    addFetchAccts[i] = addFetchAcct; 
} 

header.AddCreateAcctsRq.AddFetchAcctList.AddFetchAcct = addFetchAccts; 
+0

あなたが他の型に変換する必要があるのはなぜ?どの部分を変更できますか? – UnholySheep

+0

同じタイプの場合、1つのタイプを使用してみませんか? –

+0

プロパティの点で互いに同じ場合、なぜ2つのユニークな型がありますか? – sous2817

答えて

2

Automapperあなたは、慣例により、オブジェクトをマップするか、マッピング用のカスタムルールを定義することができます。

設定を設定した後、あなたのコードが

addFetchAccts = Mapper.Map<AddCreateAcctsReq.AddFetchAcctType[]>(addFetchAcctList); 
0

プロパティを通じてあなたは可能性だけループに帰着し、一方から他方へ割り当てます。 何かのように:

public static void MapValues<Tsource, Tdest>(Tsource source, Tdest destination) 
    { 
     var props = typeof(Tsource).GetProperties(); 

     foreach (var sourceProp in props) 
     { 
      var value = sourceProp.GetValue(source); 

      var destinationProperty = typeof(Tdest).GetProperty(sourceProp.Name); 
      destinationProperty.SetValue(destination, value); 
     } 
    } 
+0

どのようなネストされたプロパティについてですか? –

1

このコードはLINQを使用して単純化することができます。

以下は、LINQを使用して新しいオブジェクトを作成する例です。

header.AddCreateAcctsRq.AddFetchAcctList.AddFetchAcct = 
    addFetchAcctList 
     .AddFetchAcct 
     .Select(acct => 
      new AddCreateAcctsReq.AddFetchAcctType 
      { 
       FIId = acct.FIId, 
       AcctNumber = acct.AcctNumber, 
       FIAcctName = 
        acct 
        .FIAcctName 
        .Select(fiAcctName => 
         new AddCreateAcctsReq.FIAcctNameType 
         { 
          ParamName = fiAcctName.ParamName, 
          ParamVal = fiAcctName.ParamVal 
         }) 
        .ToArray(), 
       AcctBal = 
        acct 
        .AcctBal 
        .Select(acctBal => 
         new AddCreateAcctsReq.AcctBalType 
         { 
          BalType = acctBal.BalType, 
          CurAmt = 
           new AddCreateAcctsReq.AmountType 
           { 
            Amt = acctBal.CurAmt.Amt, 
            CurCode = acctBal.CurAmt.CurCode 
           } 
         }) 
        .ToArray(), 
       CurCode = acct.CurCode 
      }) 
     .ToArray(); 

も参照してください:

0

シリアライズと私のバージョン:

// Load object with some sample data 
Type1 data = GetData(); 

// Pass object for conversion object to JSON string 
string json = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(data); 

Type2 data2 = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<Type2>(json); 
関連する問題