1

SQLデータベースにデータを転送するために使用する多くのプロパティを持つかなり冗長なオブジェクトがあります。ここで、冗長なオブジェクトの一部のプロパティのみを使用する、このオブジェクトの「ライト」バージョンを提供したいと思います。

ライトオブジェクトを使用してRESTAPIを介して提供し、詳細オブジェクトを使用してデータを転送しているので、理想的にはプロセスを逆にすることもできます(詳細オブジェクトのプロパティをライトオブジェクトの既存のプロパティで上書きしてからデータベースに保存します) 。

これらのプロパティはすべて、ライトオブジェクトに存在する限り、同じデータ型になります。

簡単な例:

class Verbose {
  public string email;
  public Guid id;
}

class Simple {
  public string email;
  // don't show Guid
}

ここで、VerboseタイプのすべてのオブジェクトをSimpleタイプに変換し、不要なプロパティをすべて破棄します。これを行う簡単な方法はありますか?

理想的には、これも可逆的である必要があります。

4

3 に答える 3

2

詳細オブジェクトを受け取るコンストラクターを作成することも、その逆を行うこともできます。

public Verbose(Simple simple)
{
    this.id = Guid.NewGuid();
    this.email = simple.email;
}

public Simple(Verbose verbose)
{
    this.email = verbose.email;
}

そうすれば、少なくとも各変換方向で、すべての変換を1か所にまとめることができます。

ここでのこの質問はあなたにとって興味深いかもしれません: コンバータークラスを書く方法は?マッピングルールを効率的に作成するにはどうすればよいですか?

OPにとって重要なものとして編集

冗長=>シンプル

Simpleがのサブセットである場合は、からVerbose派生VerboseSimpleます。ここでは変換は必要ありません。

その場合、 Verbose単純です。

于 2012-07-25T08:58:12.613 に答える
2

リフレクションを使用して、オブジェクトをトラバースし、それらのプロパティ値を読み取ることができます。クラスにこの関数を追加します

private IEnumerable<PropertyInfo> GetValidInfoes()
{
    foreach (PropertyInfo info in GetType().GetProperties())
    {
         if (info.CanWrite)
            yield return info;
    }
}

このループを意味のある場所に追加します。

foreach (var item in GetValidInfoes())
{
     var source = myobject.GetType().GetProperty(item.Name);
     if (source != null)
        item.SetValue(this, source.GetValue(item.Name, item.PropertyType), null);
}
于 2012-07-25T09:00:29.930 に答える
1

AutoMapperを試してください。平坦化を使用しない場合は、元に戻すことができます。

于 2012-07-25T08:52:30.280 に答える