2

ValueInjecter を使用して次の問題を解決する方法についての提案を探しています。

注:誰かが飛び込んで、a) やり方が間違っていると言ったり、b) ValueInjecter を使うべきではないと言ったりする前に、使用ないでください。a )ソースデータを制御できないため、b)プロジェクトの他のすべての場所でValueInjecterが使用されているため、他のすべてのデータモーフィングタスクのため、別のツールキットを使用することは実際にはオプションではありません)

問題

一連のサード パーティ サービス クラスから、キー付き文字列配列としてフォーマットされたインバウンド データを受け取ります。つまり、受信オブジェクトは次のようになります。

var inboundData  = string[];
var field1 = inboundData["field1"];
var field2 = inboundData["field2"];
var field3 = inboundData["field3"];
var field4 = inboundData["field4"];

注:これは実際のデータではなく、私が扱っているもののモックアップです

ここでの主な前提は、受信データのフィールドを取得するには、フィールド名または配列インデックスを指定する必要があるということです。データを提供するライブラリは、勝ったサードパーティによって提供されているため、これを変更することはできません変更しないでください。私たちのライセンスでは変更が許可されていません。

各インバウンド データ パケットには 1 つのレコードのフィールドしか含まれていないため、複数の行を処理する必要がある場合、実際には配列の配列になりますが、これを変換することについてはまだ心配していません。最初にシングルレコード。

したがって、私がする必要があるのは、次のことです。

var inboundData  = string[];
var field1 = inboundData["field1"];
var field2 = inboundData["field2"];
var field3 = inboundData["field3"];
var field4 = inboundData["field4"];

それを次のように変換します。

public class inboundData
{
  public string field1 { get; set; }
  public string field2 { get; set; }
  public string field3 { get; set; }
  public string field4 { get; set; }
}

可能であれば、フィールド名が変更された場合に配列キー["blah"]がオブジェクト プロパティblahに自動的にマップされるように、ValueInjecter を使用してこれを実行できるようにしたいと考えています。

現在のソリューション

現時点では、データは変換されますが、次の昔ながらの方法を使用します。

var inboundData = inboundService.GetNextRecord();
InboudDataObject = new InboundDataObject
{
  field1 = inboundData["field1"],
  field2 = inboundData["field2"],
  field3 = inboundData["field3"],
  field4 = inboundData["field4"]
}

これは問題なく機能しますが、将来的には問題が発生する可能性があり、以前にこれを実行したことがある人なら誰でも、これが起こるのを待っているメンテナンスの悪夢であることを知っているでしょう.

したがって、次のようなことができるようにしたいと思います。

var inboundData = inboundService.GetNextRecord();
InboudDataObject = new InboundDataObject().InjectFrom(inboundData);

そのため、サードパーティがレコードにフィールドを追加した場合、私がしなければならないことは、その名前のフィールドをオブジェクトに追加することだけです。

今、試してみたい実験がいくつかありますが、1 日か 2 日分の調査の後、具体的なものは何も見つかりませんでした。Auto- Mapper ですが、私は Auto-Mapper を使用していないので、せいぜいそれらから得られるのはいくつかのアイデアだけです (それが私の実験の元です)。

では、これに取り組む方法についてアイデア/考えを持っている人はいますか?

乾杯ショーティ

2015 年 7 月 5 日更新

約 24 時間後、ValueInjecter の作成者である「Omu」が私の問題を一気に解決してくれました (ありがとうございます)。 .

昨夜さまざまなことを読んだ後、匿名/動的オブジェクトから具象クラスへのプロパティからプロパティへの注入を実行できるようにするために、文字列配列から動的オブジェクトを埋めることを試みることにしました。

このアプローチは、「動的オブジェクトで拡張メソッドを実行できない」という 1 つの問題を除いて、実際には機能していました。ただし、パズルの最後のピースを理解できる人もいるかもしれません。そのため、ここに私の実験的なコードを示します。どこで私の考えを参照してください:

using System.Collections.Generic;
using System.Dynamic;
using Omu.ValueInjecter;

namespace dynamic_mapping_test
{
  public class DestinationObject
  {
    public string field1 { get; set; }
    public int field2 { get; set; }
    public string[] field3 { get; set; }
    public bool field4 { get; set; }
    public double field5 { get; set; }
  }

  class Program
  {
    private static Dictionary<string, object> sourceData = new Dictionary<string, object>();

    static void Main()
    {
      sourceData["field1"] = "A person";
      sourceData["field2"] = 20;
      sourceData["field3"] = new string[] {"A thing", "A thing"};
      sourceData["field4"] = false;
      sourceData["field5"] = 999.999;

      var eo = new ExpandoObject();
      var eoCollection = (ICollection<KeyValuePair<string, object>>) eo;

      foreach (var inputObject in sourceData)
      {
        eoCollection.Add(inputObject);
      }

      dynamic eoDynamic = eo;

      DestinationObject myObject = new DestinationObject().InjectFrom((object)eoDynamic) as DestinationObject;
    }

  }
}

私はOmuの投稿を答えとしてマークしています.

4

1 に答える 1