1

次のクラスを想定します。

public class MyEntity
{
    public string FirstName;
    public string LastName;
}

の 2 つのインスタンスを比較し、他の 2 つのインスタンス間の値の違いのみを含むMyEntity新しいMyEntityインスタンスを作成したいと考えています。等しいプロパティはnull、新しいオブジェクトの値になります。

たとえば、次のコードが必要です。

MyEntity entity1 = new MyEntity() { FirstName = "Jon", LastName = "Doh" };
MyEntity entity2 = new MyEntity() { FirstName = "Jon", LastName = "The Great" };
MyEntity diffEntity = CreateDiffEntity(entity1, entity2);  // TODO 

結果は次のdiffEntity値になります。

{
    FirstName: null,
    LastName: "The Great"
}

すべてのプロパティが null 可能であると想定できます。

値が一致しない場合、新しいオブジェクトには 2 番目のオブジェクトのプロパティの値が含まれている必要があります。

さまざまなプロパティ定義を持つ多くのタイプのエンティティがあると仮定してください。
そのため、 以外のクラス タイプで使用できMyEntity、新しいプロパティがクラスに追加されたときに変更を必要としないソリューションが必要です。

最終的な目標は、クライアント モバイル アプリケーションが、エンティティに加えられた変更のみを含む DTO を ASP.NET MVC WebAPI サーバー アプリケーションに送信できるようにすることです。

どうすればこれを適切に行うことができますか?

4

5 に答える 5

2

このアプローチ全体には大きな問題がありますnull。おそらく完全なエンティティを送信するだけでよいか、プロパティのサブセットのみを編集できるインターフェイスがある場合は、そこで発生する可能性のある変更のみを含む各インターフェイスの DTO を作成する必要があります。


とにかく、簡単な改善の機が熟したという理由だけで、これはBrianV のソリューションに基づいた一般的な、わずかに変更されたソリューションです。(object.Equalsの代わりに!=使用すると、アイデンティティだけでなく、値によって物事を比較できます)

public T Compare<T>(T first, T second) where T : new()
{
    T result = new T();
    Type t = typeof(T);
    PropertyInfo[] propertyInfoList =  t.GetProperties();

    foreach (PropertyInfo propertyInfo in propertyInfoList)
    {
        object value1 = propertyInfo.GetValue(first, null);
        object value2 = propertyInfo.GetValue(second, null);

        if (!object.Equals(value1, value2))
            propertyInfo.SetValue(result, value2, null);
    }

    return result;
}

次のように使用します。

MyEntity entity1 = new MyEntity() { FirstName = "Jon", LastName = "Doh" };
MyEntity entity2 = new MyEntity() { FirstName = "Jon", LastName = "The Great" };
MyEntity diffEntity = Compare(entity1, entity2);
于 2013-08-20T18:33:02.350 に答える
0

次のように問題を解決できます。

public MyEntity CreateDiffEntity(MyEntity entity1, MyEntity entity2) {
    MyEntity diff = new MyEntity();
    diff.FirstName = !entity1.FirstName.equals(entity2.FirstName) ? entity2.FirstName : string.Empty;
    diff.LastName = !entity1.LastName.equals(entity2.LastName) ? entity2.LastName : string.Empty;
    return diff;
}
于 2013-08-20T18:17:38.010 に答える