0

私は EF4.3 を使用しているので、エンティティを参照していますが、プロパティを含むすべてのクラスに適用できます。

2 つのエンティティを比較できるかどうかを調べようとしています。各エンティティには、明確にするために値が割り当てられたプロパティがあり、エンティティが「顧客」であるとします。

public partial class Customer
{
    public string Name { get; set; }
    public DateTime DateOfBirth { get; set; }
    ...
    ...
}

顧客が私の Web サイトにアクセスし、「TypedCustomer」と入力します。これをデータベースと照合し、一部のデータが一致する場合は、データベース 'StoredCustomer' からレコードを返します。

したがって、この時点で、同じ顧客が戻ってきていることがわかりましたが、残りのデータを検証したくありません。各プロパティを 1 つずつ確認することもできますが、確認すべき点がかなりあります。それぞれの現在の値を考慮に入れて、より高いレベルでこの比較を行うことは可能ですか?

if(TypedCustomer == StoredCustomer)
{
    .... do something
} 
4

3 に答える 3

0

このシナリオでは、オブジェクト全体をチェックする目的はあまりないと思います。以前と同じように、すべてのプロパティを完全に入力する必要があり、単純な「一致するか」では実際にはわかりません。多く。しかし、それがあなたの望むものであると仮定すると、これを行ういくつかの方法を見ることができます:

1) 弾丸を噛んで、各フィールドを比較するだけです。bool Equalsこれを行うには、メソッドをオーバーライドするかIEquatable<T>.Equals、 、またはカスタム メソッドのみを使用します。

2) リフレクション、プロパティのループ - プロパティが単純なデータ フィールドの場合は単純ですが、複雑な型がある場合はより複雑です。

foreach (var prop in typeof(Customer).GetProperties()) {
    // needs better property and value validation
    bool propertyMatches = prop.GetValue(cust1, null)
        .Equals(prop.GetValue(cust2, null));
}

3) シリアル化 - 両方のオブジェクトを XML または JSON にシリアル化し、文字列を比較します。

// JSON.NET
string s1 = JsonConvert.SerializeObject(cust1);
string s2 = JsonConvert.SerializeObject(cust2);
bool match = s1 == s2;
于 2013-07-11T15:02:46.047 に答える
0

最も単純なのは reflexion を使用しているようです: 比較したいプロパティやフィールドを取得し、それらをループして 2 つのオブジェクトを比較します。
これは、getType(Customer).getProperties と getType(Customer).getFields で行われ、次に各フィールド/プロパティで getValue を使用して比較します。
フィールド/プロパティにカスタム情報を追加して、比較が必要なものを定義することができます。これは、たとえば FlagsAttribute から継承する AttributeUsageAttribute を定義することによって実行できます。次に、これらの属性を isEqualTo メソッドで取得して処理する必要があります。

于 2013-07-11T15:02:51.897 に答える